【问题标题】:how to start new thread as soon as previously thread gets finished?一旦先前的线程完成,如何启动新线程?
【发布时间】:2010-07-23 11:45:19
【问题描述】:

我必须开发将文件复制到不同服务器的 Windows 服务。 所以我必须使用多标题来完成这项任务。 但我只需要启动 3-4 个线程。 因此,每当一个线程完成时,我必须启动新线程,以便线程数应保持 3 或 4。 那么我该如何申请检查呢? 请提供一些相关信息。

【问题讨论】:

    标签: vb.net multithreading windows-services


    【解决方案1】:

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

    【讨论】:

    • 创建线程确实有可衡量的开销。即使使用 ThreadPool,我也发现了。
    • 即使是一点点节省也是一点点节省,尤其是当您免费获得它时。我发现为相同(或重复的任务)重用线程使应用程序更容易调试。特别是当你需要附加windbg时。
    【解决方案2】:

    这可能会给你一个起点。这个想法是使用一个阻塞队列,它将阻塞出队操作,直到一个项目可用。因此,您的工作线程将围绕一个无限循环旋转,等待项目出现在队列中。您的主线程会将项目排入队列。以下示例使用 .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
    

    【讨论】:

      【解决方案3】:

      在 .Net 4.0 中,这很容易处理任务:

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

      请参阅here 了解更多示例(使用 C#)。

      【讨论】:

        【解决方案4】:

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

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

        对不起 not_vb。我写它是因为我希望在 VB 中具有相同名称的相同函数。

        【讨论】:

        • 您必须在第三个线程中执行此操作,以免阻塞主线程。
        猜你喜欢
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多