2011-03-01 32 views
0

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

      } 
     } 
    } 
+0

如果你展示了一些代码,我们可以帮助你更直接。你的图书馆,你的班级,你想要打电话。 – Joe 2011-03-01 02:50:22

回答

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

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

例如,假设我有一个DownloadHtmlToString(string url)方法。通常情况下,这种方法将采用该URL,出站到网络,然后将该信息保存到字符串并返回。

通过在外部库/类/模块/等。您允许自己同步,异步地调用它,并且可以使用多个线程/任务而不必编辑该主要功能。关键是要使DownloadHtmlToString()方法是线程安全的。

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

0

在班级内创建新线程。

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

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

如果此课程仅用于中奖申请,请将其标记为STA,并防止以不安全的方式由多个主题共享此课程。

相关问题