ThreadPool完成工作,当程序关闭时

时间:2013-10-09 12:05:04

标签: vb.net multithreading threadpool threadgroup

当程序关闭时,有没有办法让ThreadPool完成它的工作?

当我使用普通的Thread时,我只是在FormClosing事件中插入t.Join ..但ThreadPool似乎没有任何Join方法?

2 个答案:

答案 0 :(得分:1)

我不认为你可以让Threadpool等待。如何使用Task代替线程池?下面代码的效果。您可以查看完整示例here以获得更好的理解

    Dim taskA = Task.Factory.StartNew(Sub() DoSomeWork(10000000))
    taskA.Wait()
    Console.WriteLine("taskA has completed.")

答案 1 :(得分:0)

我想我可能已经解决了它。

Imports System.Threading

Module Module1

    Sub Main()
        Dim t As New Tool
        t.WaitToJoin()
        Console.WriteLine("Done")
        t.WaitToJoin()
        Console.WriteLine("Done")
        t.WaitToJoin()
        Console.WriteLine("Done")
        t.WaitToJoin()
        Console.WriteLine("Done")
        t.Update()
        t.WaitToJoin()
        Console.WriteLine("Done")

        t.Update()
        Thread.Sleep(1500)
        t.Update()
        t.WaitToJoin()
        Console.WriteLine("Done")

        t.Update()
        Thread.Sleep(1500)
        t.Update()
        Thread.Sleep(1500)
        t.Update()
        Thread.Sleep(5500)
        t.Update()
        Thread.Sleep(10000)
        t.Update()
        t.WaitToJoin()
        Console.WriteLine("Done")
    End Sub

End Module

Public Class Tool
    'Thread Stuff
    Private threads As Integer = 0
    Private threadsdone As AutoResetEvent = New AutoResetEvent(False)

    Public Sub WaitToJoin()
        If Interlocked.Read(threads) > 0 Then
            threadsdone.WaitOne(New TimeSpan(0, 0, 30)) ' just to be sure not to lock forever, by some wierd reason, a timeout on 30 sec is added
        End If
    End Sub

    Public Sub Update()
        Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf HardWork), "Doing dome hard work...")
    End Sub

    Public Sub HardWork(ByVal state As Object)
        Dim num As Integer = Interlocked.Increment(threads)
        Console.WriteLine(num & " - " & state)

        Thread.Sleep(10000)
        If Interlocked.Decrement(threads) = 0 Then
            threadsdone.Set()
        End If
    End Sub
End Class