2011-03-01 58 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,並防止以不安全的方式由多個主題共享此課程。

相關問題