应该在哪里处理查询方法的线程?

时间:2011-03-01 02:34:55

标签: c# .net multithreading threadpool

我创建了一个类库,它有一个查询开放端口的方法,在某些情况下最多可能需要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;

            }
        }
    }

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

在班级内创建新主题。

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

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

如果此类仅在win-form应用程序中使用,请将其标记为STA,并防止以不安全的方式通过多个线程共享它。