【发布时间】:2010-07-23 11:45:19
【问题描述】:
我必须开发将文件复制到不同服务器的 Windows 服务。 所以我必须使用多标题来完成这项任务。 但我只需要启动 3-4 个线程。 因此,每当一个线程完成时,我必须启动新线程,以便线程数应保持 3 或 4。 那么我该如何申请检查呢? 请提供一些相关信息。
【问题讨论】:
标签: vb.net multithreading windows-services
我必须开发将文件复制到不同服务器的 Windows 服务。 所以我必须使用多标题来完成这项任务。 但我只需要启动 3-4 个线程。 因此,每当一个线程完成时,我必须启动新线程,以便线程数应保持 3 或 4。 那么我该如何申请检查呢? 请提供一些相关信息。
【问题讨论】:
标签: vb.net multithreading windows-services
为什么不重用线程而不是产生新线程? 除此之外,看看称为生产者/消费者队列的模式。您的生产者添加文件(它们的路径信息),消费者读取并采取适当的行动(执行复制操作)
【讨论】:
这可能会给你一个起点。这个想法是使用一个阻塞队列,它将阻塞出队操作,直到一个项目可用。因此,您的工作线程将围绕一个无限循环旋转,等待项目出现在队列中。您的主线程会将项目排入队列。以下示例使用 .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
【讨论】:
在 .Net 4.0 中,这很容易处理任务:
Dim a As new Task(AdressOf doWork).ContinueWith(AdressOf doOtherWork)
请参阅here 了解更多示例(使用 C#)。
【讨论】:
我不懂 VB,但我知道的所有其他语言都有这种操作:join()。
int main(){
threadA.start();
threadA.join(); //here main() wait threadA end
threadB.start(); //what you want
}
对不起 not_vb。我写它是因为我希望在 VB 中具有相同名称的相同函数。
【讨论】: