2010-07-23 75 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#中)。

相关问题