2017-07-11 6 views
3

私はこの計算ジョブを持っているので、6つのスレッドをstartngする必要があり、それらが終了するのを待っています。スレッドは、クラス内の「ローカル」変数を変更します。 ローカル変数が特定の値になったら、関数を "True"に戻したいと思います。しかし、スレッドをハングしないような方法でこれを実行したいと思います。したがって、一定の "Do Loop"は動作しません。これを行う標準的な方法はありますか?戻って条件が掛かっていなくても一度戻ります

Public Function Start(ByVal Cores As Integer) As Boolean 
    For i = 0 To 10 
     // Heavy work 

     Task.Factory.StartNew(Sub() Compute(Core, StartInt, EndInt)) 

    Next 

    Do // <- How to avoid checking ThreadsTerimnated = ThreadsStarted every clockcycle? 
     // Threading.Sleep hangs thread. 

     If ThreadsTerminated = ThreadsStarted Then 
      MergeResults(Cores) 
      Return True 
     End If 
    Loop 

End Function 
+0

を使用することができます) 'これは指定されたミリ秒間スレッドをブロックせずに処理を停止します。スレッドを一時停止することを検討していたので、これをFYIとして含めました。 – Fabulous

答えて

4

あなたは、あなたがそれをぶら下げせずにスレッドを一時停止する必要がある場合、あなたは `(Task.Delayを待つ呼び出すことができることを知ってほしいことがありますTasksのリストを保持し、Tasks.WaitAll

Dim tasks As New List(Of Task) 
For i = 0 To 10 
    // Heavy work 
    tasks.Add(Task.Factory.StartNew(Sub() Compute(Core, StartInt, EndInt))) 
Next 

Task.WaitAll(tasks.ToArray()) 
+1

'Task.WhenAll'もオプションです。 https://stackoverflow.com/a/6123432/2084315 – ps2goat

+0

パーフェクト。ちょうど私が探していたもの。 – Ruse

+2

この答えは理にかなっていません - 「WaitAll」は間違いなく「糸を掛けます」 - なぜそれが質問に関係するのかという良い説明があるでしょう。 –

関連する問題