2010-07-23 74 views
1

我必須開發Windows服務,它將文件複製到不同的服務器。 所以我必須使用多主題來完成這項任務。 但我必須開始只有3-4線程。 因此,每當一個線程完成後,我必須開始新的線程,以便線程數應保持3或4. 那麼我怎麼能申請檢查呢? 請提供一些相關信息。如何在前一個線程完成後立即啓動新線程?

回答

1

這可能會給你一個出發點。這個想法是使用一個阻塞隊列,它將阻止出隊操作,直到一個項目可用。所以你的工作線程會圍繞無限循環旋轉,等待項目出現在隊列中。您的主線程會將這些項目排入隊列。以下示例使用.NET 4.0 BCL中的BlockingCollection類。如果這不適用於您,則可以從Stephen Toub's blog獲得阻塞隊列的實現。

Module Example 

    Private m_Queue As BlockingCollection(Of String) = New BlockingCollection(Of String) 

    Sub Main() 

     Dim threads(4) As Thread 
     For i As Integer = 0 To threads.Length - 1 
      threads(i) = New Thread(AddressOf Consumer) 
      threads(i).IsBackground = True 
      threads(i).Start() 
     Next 

     Dim files As IEnumerable(Of String) = GetFilesToCopy() 

     For Each filePath As String In files 
      m_Queue.Add(filePath) 
     Next 

    End Sub 

    Sub Consumer() 
     Do While True 
      Dim filePath As String = m_Queue.Take() 
      ' Process the file here. 
     Loop 
    End Sub 

End Module 
0

我不知道VB,但我知道的所有其他語言都有這種操作:join()。

int main(){ 
    threadA.start(); 
    threadA.join(); //here main() wait threadA end 
    threadB.start(); //what you want 
} 

對不起,not_vb。我寫了它,因爲我期望VB中具有相同名稱的相同函數。

+0

你必須在第三個線程中這樣做,所以你不要阻塞主要的。 – 2010-07-23 12:09:11

2

爲什麼不重用線程而不是產生新線程? 除此之外,看看一個稱爲生產者/消費者隊列的模式。你生產者增加了文件(其路徑信息),消費者閱讀,並採取適當的行動(執行復制操作)

+0

創建一個線程確實有可測量的開銷。即使使用ThreadPool,我發現。 – 2010-07-23 11:56:07

+0

即使是一個小小的節約也能節省一點,特別是當你免費得到它的時候。 我發現爲相同的(或重複的任務)重複使用線程使應用程序更容易調試。特別是當你需要連接windbg時。 – MaLio 2010-07-23 12:21:13

0

在.NET 4.0中,這是很容易做到的任務:

Dim a As new Task(AdressOf doWork).ContinueWith(AdressOf doOtherWork) 

here更多示例(在C#中)。

相關問題