【发布时间】:2011-12-01 13:30:23
【问题描述】:
我一直在考虑 C# 5 中的新异步内容,但出现了一个特别的问题。
我知道await 关键字是一个简洁的编译器技巧/语法糖来实现continuation passing,其中方法的其余部分被分解为Task 对象并排队等待按顺序运行,但是其中控制权返回给调用方法。
我的问题是我听说目前这一切都在一个线程上。这是否意味着这种异步内容实际上只是将延续代码转换为Task 对象,然后在每个任务完成后调用Application.DoEvents() 的一种方式,然后再开始下一个任务?
或者我错过了什么? (这部分问题是修辞性的 - 我完全知道我错过了 something :))
【问题讨论】:
-
你从哪里听说这个在单线程上运行的?
Task,在任务并行库中使用,根据需要使用线程池创建多个线程。 -
不是必然在一个线程上,也不是必然在多个线程上。您无法保证可以在哪个线程上执行延续。
-
来自用户组的发言人。此外,虽然不是一个明确的声明,但我记得 Eric Lippert 在本文中提到它可以在单个线程上进行:msdn.microsoft.com/en-gb/magazine/hh456401.aspx。这样做的目的是您不会出现线程不足,并且可以开始在比目前 PC 更少功率的设备上编写响应式应用程序(想想 Windows 8 所针对的各种设备)。
-
@NeilBarnwell - 如果这是我看到的相同演示文稿,他们意味着 async/await 模式没有明确触发线程来处理它。延续可能发生在同一个线程上,也可能不会。如果我理解正确,它甚至可以由(某种程度上)任意现有线程处理。
标签: c# asynchronous concurrency async-await continuations