最初我以为所有延续都在线程池上执行(给定一个默认的同步上下文)。但是,当我使用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
被调用于一个特定的线程和TaskCompletionSource
未设置停留了一段时间,这意味着返回的任务IsComplete = false
。然后过了一段时间,同一个线程会继续调用_tcs.SetResult(x)
,根据我的理解,它应该在线程池上运行延续。
但我在我的应用程序中观察到,运行延续的线程实际上仍然是相同的线程,就好像继续被同步调用一样,因为SetResult
被调用。
我甚至试着在SetResult
上设置一个断点,并在它上面跳过(并且在继续中有一个断点),然后实际上继续同步地调用continuation。
到底什么时候SetResult()
立即同步调用延续?
如果你提供一个[mcve]而不是它的* half *,这将有所帮助,所以我们可以自己尝试一下... –