相互に依存するタスクを設定する方法このセクションでは、ショー。私たちは、親タスクが完了すると、それだけで実行されます、タスクを作成する方法を学びます。また、スレッドのオーバーヘッドを節約の可能性を探求することは、非常に短い使命です。
クラスプログラム { 静的な 無効メイン(文字列[] argsを) { VAR firstTask = 新しい新しいタスク< 整数 >(()=> TaskMethod(" 最初のタスク"、3。 )); VAR SecondTask = 新しい新しいタスク< 整数 >(()=> TaskMethod(「第2のタスク」、2 )); firstTask.ContinueWith(//最初の後続の操作にタスクを設定するには、最初のタスクが完了した後に行わ T(=> Console.WriteLineを" 第一回答は{0}です。スレッドID {1}は、スレッドでありプールスレッド:{2}" 、 T.Result、Thread.CurrentThread.ManagedThreadId、Thread.CurrentThread.IsThreadPoolThread)、 TaskContinuationOptions.OnlyOnRanToCompletion); firstTask.Start(); secondTask.Start(); のThread.sleep(TimeSpan.FromSeconds(4 )); // ----二つのタスクの完了のためのメインスレッド待ちの上、4秒完全に上記の操作2行うのに十分でなければならない
上記のステートメントうち//コメントは、メインスレッドは、直接次のステートメント、その後の操作放電の第2のタスクを実行しますスレッドプール
/ *その後の動作の2番目のタスクを設定し、TaskContinuationOptions.ExecuteSynchronouslyが同期実行を設定し、
*上記の4秒間待たない場合は、スレッドプールへのその後の動作が実行を完了した後、2番目のタスクを待つ。もし4秒待って、以下のための、すなわち待ち
第2のタスクが完了した*は、その後の動作は、メインスレッドに実行されます。その後の動作は、非常に短いために入れてよりメインスレッドので、
*は、高速なスレッドプールを実行しています。
* TaskContinuationOptions.OnlyOnRanToCompletionは、2番目のタスクは、フォローアップタスクの完了後にスケジュールされることを示します。
* /
継続タスク = secondTask.ContinueWith(//第2のタスクは、別の後続の操作を実行
T => Console.WriteLineを(「ザ・第二のスレッドIDに答える{{0}}。1、プール・スレッドのスレッドである:。{2} 」、
t.Result、Thread.CurrentThread.ManagedThreadId、Thread.CurrentThread.IsThreadPoolThread)、
TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously)
。continuation.GetAwaiter()は、(OnCompleted //するために継続タスク、後続のタスクを整理していき
() => Console.WriteLineを(「!タスク継続は完了スレッドIDは{0}は、プールスレッドのスレッドです:{} 1。」、
Thread.CurrentThread.ManagedThreadId、Thread.CurrentThread.IsThreadPoolThread));
のThread.sleep(TimeSpan.FromSeconds(2 ));
Console.WriteLineを(); //息子のスレッドに関連する次のタスク/ *サブタスクは、親タスクで実行する必要がありますときに我々が作成し、追加の親タスクに右! * TaskContinuationOptions。すべてのサブタスクが完了している場合にのみ、親タスクにAttachedToParentハンドルタスクを、親タスクが完了します。 * /
FirstTask
= 新しい新しいタスク< 整数 >(()=> //新しいタスクを作成
{
//提供AttachedToParentは、いわゆるサブオプションのタスクで実行されるように
VAR innerTask = Task.Factory.StartNew(()=> TaskMethod(" タスクSECOND、"、5)、TaskCreationOptions.AttachedToParent)。
innerTask.ContinueWith(T => TaskMethod(" タスク3 "、2 )、TaskContinuationOptions.AttachedToParent)。
リターン TaskMethod(" 最初のタスク"、2 );
});
firstTask.Start();
しばらく(!firstTask.IsCompleted)
{
Console.WriteLineを(firstTask.Status)。
Thread.sleep(TimeSpan.FromSeconds(0.5 ))。
}
Console.WriteLineを(firstTask.Status)。
Thread.sleep(TimeSpan.FromSeconds(10 ))。
}
静的 INT TaskMethod(文字列名、int型秒)
{
Console.WriteLineを(" タスク{0}スレッドID {1}上で実行されているが、スレッドプールのスレッドである:{2} " 、
名前、Thread.CurrentThread.ManagedThreadId、スレッド.CurrentThread.IsThreadPoolThread);
Thread.sleep(TimeSpan.FromSeconds(秒));
戻る 42 * 秒。
}
}