簡単なことをしたい(それContinueWith
がスレッドセーフであると仮定して):
readonly Task _task = Task.CompletedTask;
// thread A: conditionally prolong the task
if(condition)
_task.ContinueWith(o => ...);
// thread B: await for everything
await _task;
問題: 上記のコードでは、すぐに戻り、内部タスクawait _task
があるかどうかを無視します。
複数回_task
延長できる要件を拡張していますが、それらすべてが終了するのをどのように待ちますか? ContinueWith
もちろん、私は古いスレッドセーフな方法でそれを試みることができます:
Task _task = Task.CompletedTask;
readonly object _lock = new object();
// thread A
if(condition)
_lock(_lock)
_task = _task.ContinueWith(o => ...); // storing the latest inner task
// thread B
lock(_lock)
await _task;
または、タスクをスレッドセーフ コレクションに格納し、Task.WaitAll
.
しかし、最初のスニペットを簡単に修正できるかどうか知りたいです。