なぜTask.ContinueWith()
メソッドが必要ですか?タスク本体の中にその「継続コード」を書くことはできませんか?なぜContinueWithメソッドが必要ですか?
答えて
時には外部からタスクを受け取り、それに継続をチェーンしたいことがあります。アクションなしでタスクを作成する方法もあります(TaskCompletionSourceなどを使用)。
タスクの継続は、タスクのチェーンにあなたをできるように、チェーン内の各タスクは、あなたが非同期的に確認することができ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
サーシャGoldshteinの答えが正しいことを確認します。あなたの「継続」コンポジションコードがタスクに直接アクセスしたり、タスクの実行方法を設定したりしない場合があります。例えば、タクを集約したいプラガブルなシステムです。
ただし、適用できる別の理由があります。粒度
TaskCreationOptions.LongRunningの使用を誘発する可能性のある要件を考慮してください。何百ものプロセスがスケジュールされ、実行され、完了している並列システムでは、タスクスケジューラは、タスクをスケジューリングするときに効率的なプロセッサアフィニティを促進するように働いています。
タスクを細かいサブタスクに分割してチェーン化できる状況にある場合は、TaskCreationOptions.LongRunningを使用する必要はなくなります。簡単に言えば、4つのコアしか使用できない環境で10の大きなタスクを同じスケジュールで実行するようにスケジュールするのではなく、100の小さなタスクを同時に完了するようにスケジュールする方が簡単なため、これはより効果的です。連鎖されたタスクは、それが先行した直後に開始することが保証されていないことに注意してください。
スケーラブルなシステムが必要な場合にのみ問題になるのは興味深い質問です。
私に聞いたら、可能な限りContinueWith()を使用して、アプリケーションの規模に役立てる必要があります。
- 1. なぜDataBind()メソッドが必要ですか?
- 2. なぜBuffer.isBufferメソッドが必要ですか?
- 3. CustomFieldSerializerに静的メソッドが必要なのはなぜですか?
- 4. メソッドに戻り値が必要なのはなぜですか?
- 5. java静的メソッドなぜ必要です
- 6. loadClassメソッドでfindLoadedClassメソッド呼び出しが必要なのはなぜですか?
- 7. jQuery 1.7 .on()メソッド、なぜそれが必要ですか?
- 8. なぜこの例では変数ではなくメソッドが必要ですか?
- 9. なぜバイナリコードコンバータが必要ですか?
- 10. なぜNotificationCompatが必要ですか?
- 11. なぜServer.HtmlEncodeが必要ですか?
- 12. なぜinstantiateViewContollerが必要ですか?
- 13. なぜHadoop KMSが必要ですか?
- 14. なぜReaderLockが必要ですか?
- 15. なぜコンテキストリダクションが必要ですか?
- 16. なぜsession_ destroy()が必要ですか?
- 17. なぜweb.debug.configが必要ですか?
- 18. なぜトークンスキームが必要ですか?
- 19. なぜasyncio.coroutineデコレータが必要ですか?
- 20. なぜcmakeが必要ですか?
- 21. バッシュプログラミング、なぜバックスラッシュが必要ですか?
- 22. なぜ[basic.scope.class]/2が必要ですか?
- 23. なぜlvalueが必要ですか?
- 24. なぜFLAGSが必要ですか?
- 25. なぜng-clickが必要ですか?
- 26. onelogin:なぜRequestedAuthnContextが必要ですか?
- 27. なぜHyper-Vが必要ですか?
- 28. なぜnp.squeeze()が必要ですか?
- 29. なぜoffsetofマクロが必要ですか?
- 30. なぜListIteratorが必要ですか?