最初はすべての継続がスレッドプール上で実行されると考えました(デフォルトの同期コンテキストが与えられています)。しかし、これは私がTaskCompletionSource
を使用した場合には当てはまらないようです。この場合、TaskCompletionSource.SetResult()は継続を同期して実行しますか?
私のコードは次のようなものになります。
Task<int> Foo() {
_tcs = new TaskCompletionSource<int>();
return _tcs.Task;
}
async void Bar() {
Console.WriteLine(Thread.Current.ManagedThreadId);
Console.WriteLine($"{Thread.Current.ManagedThreadId} - {await Foo()}");
}
Bar
を返されたタスクIsComplete = false
を意味し、特定のスレッドといくつかの時間のための設定を解除TaskCompletionSource
滞在に呼び出されます。その後、しばらくしてから同じスレッドが_tcs.SetResult(x)
にコールされます。これは私の理解ではスレッドプール上で継続を実行する必要があります。
私のアプリケーションで観察したことは、継続が正常に同期されているかのように、継続を実行しているスレッドが実際には同じスレッドであることです。SetResult
が呼び出されました。
私はさらにSetResult
にブレークポイントを設定し、それを踏み越えて(そして継続中にブレークポイントを持つ)、実際に継続を連続して呼び出すことになりました。
正確にSetResult()
が直ちに継続を連続して呼び出すのですか?
これは、その半分ではなく[mcve]を提供すると助けになるので、私たち自身で実験することができます。 –