【发布时间】:2015-04-23 14:54:52
【问题描述】:
使用此代码:
static void Main(string[] args)
{
Console.WriteLine("Main Thread Pre - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
Task.Run(() => AsyncMethod()).Wait();
Console.WriteLine("Main Thread Post - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
Console.ReadKey();
}
static async Task AsyncMethod()
{
Console.WriteLine("AsyncMethod Thread Pre - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
await Task.Delay(4000).ConfigureAwait(false);
Console.WriteLine("AsyncMethod Thread Post - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
}
输出是:
Main Thread Pre - 8652
AsyncMethod Thread Pre - 4764
AsyncMethod Thread Post - 1768
Main Thread Post - 8652
使用并发可视化工具,我可以看到在 4 秒延迟期间,线程 4764 卡在同步中。它最终在关闭时被主线程解除阻塞。
线程 4764 一旦碰到await,不应该返回到ThreadPool 吗? (话虽这么说,我不知道并发可视化器中会是什么样子)
【问题讨论】:
-
您能否在不借助并发可视化工具的情况下演示任何类型的问题?
-
不,我不能。我这样做是为了看看并发可视化器中等待的线程是什么样子的,并且惊讶地发现它在等待后位于同步类别中。要么我对异步的理解不正确,要么我误解了并发可视化工具告诉我的内容。我想我只是在确认线程 4764 在等待时实际上应该返回到 ThreadPool。
-
任务线程被延迟,但延迟调用仍在内部运行计时器,因此正在工作。延迟不是调度延迟。
-
那么在延迟完成之前阻止 4764 是否有意义?
标签: c# multithreading async-await