Search code examples
vb.netmultithreadingthreadpoolthreadgroup

ThreadPool Finish Work, when program is closing


Is there a way to make a ThreadPool finish its work, when the Program is closing?

when i was using a normal Thread, i just putted in t.Join on the FormClosing event.. but ThreadPool seems not not have any Join methode?


Solution

  • i think i might have solved it..

    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