5

こんにちは_noOfThreads、一度に実行する定義済みのタスクがあります。そのため、演算子を使用してタスクを継続し%、ループの最後にTasks.WaitAll. これはコード スニペットです。

for (int index = 0; index < count; index++)
{

                if (index < _noOfThreads)
                    tasks[index] = Task.Factory.StartNew(somedelegate);
                else
                    tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                            TaskContinuationOptions.AttachedToParent);
 }
  Task.WaitAll(tasks);

ただし、子タスクが完了するのを待たないことに気付きました。親タスクが完了するとすぐに、次の行Task.WaitAllが実行されます。子タスクも待機するようにこのコードを変更するにはどうすればよいですか?

4

2 に答える 2

8

タスクを次のように割り当てていると思います:

Tasks[] tasks = new Task[ _noOfThreads];

コードを次のように変更します。

Tasks[] tasks = new Task[count];

for (int index = 0; index < count; index++)
{

    if (index < _noOfThreads)
         tasks[index] = Task.Factory.StartNew(somedelegate);
    else
         tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                            TaskContinuationOptions.AttachedToParent);
}
Task.WaitAll(tasks);

試してみる!幸運を :)

于 2012-05-23T13:35:09.323 に答える
3

元のタスクだけを待っています。すべての継続が完了するのを待つにはWaitAll、継続タスクを呼び出す必要があります。これを達成する簡単な方法は、各継続タスクを元の変数に再割り当てして、最後の継続のみを待機することです。

else
    tasks[index % _noOfThreads] =
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                        TaskContinuationOptions.AttachedToParent);

この関連する質問も参照してください。

于 2012-05-23T13:36:47.130 に答える