首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在前一个线程完成后立即启动新的线程?

如何在前一个线程完成后立即启动新的线程?
EN

Stack Overflow用户
提问于 2010-07-23 19:45:20
回答 4查看 847关注 0票数 1

我必须开发windows服务,它将复制文件到不同的服务器。所以我必须使用多通道来完成这项任务。但我只需要启动3-4个线程。所以每当一个线程结束时,我必须启动新的线程,这样线程的数量应该保持在3或4,那么我该如何对其进行检查呢?请提供一些相关信息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-23 22:20:18

这可能会给你一个起点。这个想法是使用阻塞队列,它将阻塞出队操作,直到有项可用。因此,您的工作线程将围绕一个无限循环,等待项目出现在队列中。您的主线程会将这些项排队到队列中。下面的示例使用.NET 4.0 BCL中的BlockingCollection类。如果您不能使用它,那么您可以从Stephen Toub's blog获得阻塞队列的实现。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2010-07-23 19:51:55

为什么不重用这些线程而生成新的线程呢?除此之外,看看一种称为生产者/消费者队列的模式。生产者添加文件(它们的路径信息),消费者读取该文件并采取适当的操作(执行复制操作)

票数 2
EN

Stack Overflow用户

发布于 2010-07-23 19:50:50

我不知道VB,但我知道的所有其他语言都有这样的操作: join()。

代码语言:javascript
运行
复制
int main(){
  threadA.start();
  threadA.join(); //here main() wait threadA end
  threadB.start(); //what you want
}

为not_vb感到遗憾。我写它是因为我希望在VB中有相同名称的相同函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3317798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档