【问题标题】:Where should threads be handled for a query method?查询方法的线程应该在哪里处理?
【发布时间】:2011-03-01 02:34:55
【问题描述】:

我创建了一个类库,它有一个查询开放端口的方法,在某些情况下可能需要 3 秒才能完成。如果我要在单独的线程中实现它,是在我的类方法中处理,还是由最高实体(例如主窗体)完成?

您能否提供在类内部处理线程的示例?

[编辑]

这是有问题的方法。

 public void QueryOpenPorts(out string[] portNames, out bool[] isOpen)
    {
        // get valid ports on computer
        portNames = QueryPortNames();
        // number of ports
        int count = portNames.Length;
        // initialise isOpen array
        isOpen = new bool[count];

        // iterate through ports and test connection
        for (int i = 0; i < count; i++)
        {
            using (SerialPort serialPort = new SerialPort(portNames[i]))
            {

                serialPort.Open();
                // port is available 
                isOpen[i] = true;

            }
        }
    }

【问题讨论】:

  • 如果您显示一些代码,我们可以更直接地帮助您。你的图书馆,你的班级,你想叫什么。

标签: c# .net multithreading threadpool


【解决方案1】:

在架构上,我会从主窗体创建一个线程,该线程将调用您的类库。谁知道呢,也许其他调用你的库的类不需要在线程中调用。

在我的主要课程中,我有类似的东西:

this._checkSessionTimer = new Timer(intTimer * 2000);
this._checkSessionTimer.Elapsed += (o, e) => CheckSessions();

CheckSessions 开始调用它需要的任何东西。

我还使用后台工作人员来完成需要长时间使用 Web 服务器的工作:

 BackgroundWorker linkWorker = new BackgroundWorker();
            linkWorker.DoWork += (o, e) =>
                             {
                             ...
                             };
            linkWorker.RunWorkerAsync();

我的工作人员 DoWork 中的匿名函数实际上使用我的 Web 服务包装器来进行 Web 服务调用。

但是,在做这样的事情之前,我真的建议您阅读一下:
http://www.albahari.com/threading/

【讨论】:

    【解决方案2】:

    我很少会在同一个类中处理多线程代码。尽可能尝试使用外部库,因为这将允许您使用不同的异步方式来调用它(不仅仅是通过多个线程)。

    例如,假设我有一个 DownloadHtmlToString(string url) 方法。通常,此方法会获取该 URL,访问网络,然后将该信息保存到字符串并返回。

    通过将其放在外部库/类/模块/等中。您允许自己以同步、异步和多个线程/任务的方式调用它,而无需编辑该主要功能。关键是使 DownloadHtmlToString() 方法线程安全。

    我养成了使事物线程安全的习惯,即使由于将来的维护,它们最初不打算被异步调用。谁知道呢,未来 5 年我们可能会有 256 核的机器,但我的代码仍然需要在企业环境中运行,并且能够随着新硬件进行扩展。

    【讨论】:

      【解决方案3】:

      在您的班级中创建新线程。

      创建线程,就像其他主题一样,应该在面向对象的规则下完成。 Encapsulation 规定我们隐藏对象的功能。

      I/O 操作(如 network 操作)是我们需要阻塞和非阻塞方法的好例子。

      如果该类仅用于win-form应用程序,请将其标记为STA,并防止多线程以不安全的方式共享它。

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 2012-07-18
        • 2019-06-19
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多