答えて

9

時には外部からタスクを受け取り、それに継続をチェーンしたいことがあります。アクションなしでタスクを作成する方法もあります(TaskCompletionSourceなどを使用)。

5

タスクの継続は、タスクのチェーンにあなたをできるように、チェーン内の各タスクは、あなたが非同期的に確認することができTask.ContinueWith方法で一つの他のタスクも

が続いているTask対象Taskが完了またはエラーが

が発生した場合に TaskContinuationOptionsと詳細については
Task task = Task.Factory.StartNew 
(
    () => 
     { 
      //Your action when the task started 
     } 
); 

task.ContinueWith 
(
    _ => 
     { 
      //Your action when the task completed 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

task.ContinueWith 
(
    (t) => 
     { 
      //Action when error occured 
      Exception exception = null; 

      if (t.Exception.InnerException != null) 
      { 
      exception = t.Exception.InnerException; 
      } 
      else 
      { 
      exception = t.Exception; 
      } 

      //You can use this exception 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

here

10

サーシャGoldshteinの答えが正しいことを確認します。あなたの「継続」コンポジションコードがタスクに直接アクセスしたり、タスクの実行方法を設定したりしない場合があります。例えば、タクを集約したいプラガブルなシステムです。

ただし、適用できる別の理由があります。粒度

TaskCreationOptions.LongRunningの使用を誘発する可能性のある要件を考慮してください。何百ものプロセスがスケジュールされ、実行され、完了している並列システムでは、タスクスケジューラは、タスクをスケジューリングするときに効率的なプロセッサアフィニティを促進するように働いています。

タスクを細かいサブタスクに分割してチェーン化できる状況にある場合は、TaskCreationOptions.LongRunningを使用する必要はなくなります。簡単に言えば、4つのコアしか使用できない環境で10の大きなタスクを同じスケジュールで実行するようにスケジュールするのではなく、100の小さなタスクを同時に完了するようにスケジュールする方が簡単なため、これはより効果的です。連鎖されたタスクは、それが先行した直後に開始することが保証されていないことに注意してください。

スケーラブルなシステムが必要な場合にのみ問題になるのは興味深い質問です。

私に聞いたら、可能な限りContinueWith()を使用して、アプリケーションの規模に役立てる必要があります。

関連する問題