2013-10-09 1 views

ответ

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 
1

Я не думаю, что вы можете сделать Threadpool ждать. Как насчет использования Task вместо threadpool? Что-то подействовало как следующий код. Вы можете проверить полный пример here для лучшего понимания

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

хорошо главная проблема в том, что мне нужно знать, когда ВСЕ мои задачи выполняются, как 1 задача может длиться дольше, чем другая. Если я только отслеживаю последнюю задачу, я могу наблюдать за одним из тех, кто занимает больше времени – Droa