TaskCompletionSourceで公開されているタスクが呼び出されない場合、どのようにして誰かがタスクを待つまで、結果の計算を決めることができますか?遅延タスクコンプリートソースを実装するにはどうしたらいいですか?
たとえば、次のWaitOneAsync関数を使用してManualResetEventが通知されるまで、他の非同期スレッドの実行をブロックしたいとします。 WaitHandleが通知されたときに発生するThreadPool.RegisterWaitForSingleObjectのコールバックでTaskCompleationSourceを完了します。しかし、誰もタスクを待っていなければ、私はRegisterWaitForSingleObject(WaitHandleが通知された後にタスクが待たれている場合はRegisterWaitForSingleObjectにしたくありません)をしたくありません。
WaitOneAsyncを変更して、RegisterWaitForSingleObjectに対して結果を計算する作業が、誰かがTaskCompleationSource.Taskを待ってからだけ行われるようにするにはどうすればよいですか?
私は...スコット・チェンバレンによって、ここで説明したようImplement AsyncManualResetEvent using Lazy<T> to determine if the task has been awaited答えはカスタムTaskAwaiterにあるのかもしれないが、私は非常に私の解決策に彼の例から得ることができないと信じて:(
public static async Task<T> WaitOneAsync<T>(this WaitHandle waitHandle, Func<T> result) {
var tcs = new TaskCompletionSource<T>();
RegisteredWaitHandle rwh = null;
rwh = ThreadPool.RegisterWaitForSingleObject(
waitObject: waitHandle,
callBack: (s, t) => {
rwh.Unregister(null);
tcs.TrySetResult(result());
},
state: null,
millisecondsTimeOutInterval: -1,
executeOnlyOnce: true
);
return await tcs.Task;
}
@ChristopherKing ['AsyncFactory.FromWaitHandle'](http://dotnetapis.com/pkg/Nito.AsyncEx/3.0.1/net45/doc/Nito.AsyncEx.AsyncFactory/FromWaitHandle(System.Threading.WaitHandle)も参照してください) ) –