【发布时间】:2017-01-10 19:36:42
【问题描述】:
最初我认为所有的延续都在线程池上执行(给定一个默认的同步上下文)。但是,当我使用 TaskCompletionSource 时,情况似乎并非如此。
我的代码如下所示:
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 上设置断点并越过它(并在延续中设置断点),这反过来实际上会继续同步调用延续。
SetResult()具体什么时候立即同步调用延续?
【问题讨论】:
-
如果您提供 minimal reproducible example 而不是 一半 它会有所帮助,这样我们就可以自己进行试验...
标签: c# multithreading asynchronous async-await