使用タスク並列ライブラリ - タスクの組み合わせ

  相互に依存するタスクを設定する方法このセクションでは、ショー。私たちは、親タスクが完了すると、それだけで実行されます、タスクを作成する方法を学びます。また、スレッドのオーバーヘッドを節約の可能性を探求することは、非常に短い使命です。

クラスプログラム
{ 
    静的な 無効メイン(文字列[] 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 * 秒。 } }

 

おすすめ

転載: www.cnblogs.com/gougou1981/p/12610287.html