所以我最近一直在阅读大量关于网络异步 CTP 的内容,并且不断出现的一件事是这样的句子:“异步不是关于启动新线程,而是关于多路复用工作”和“没有多线程的异步是相同的想法[与协作多任务处理]。您执行一项任务一段时间,当它产生控制权时,您在该线程上执行另一项任务一段时间“。
我试图了解这样的言论是否纯粹(嗯,主要是)深奥和学术,或者是否有一些我忽略的语言结构允许我通过“等待”开始的任务神奇地在 UI 线程上运行。
在他的博客中,Eric Lippert 给出了这个例子来演示如何在没有多线程的情况下使用 Asyncrhony:
async void FrobAll()
{
for(int i = 0; i < 100; ++i)
{
await FrobAsync(i); // somehow get a started task for doing a Frob(i) operation on this thread
}
}
现在,这是让我感兴趣的评论:“......获得一个开始的任务,在这个线程上执行 Frob(i) 操作”。
这怎么可能?这主要是理论上的评论吗?到目前为止,我能看到的唯一一个任务似乎不需要单独线程的情况(好吧,除非你检查代码,否则你无法确定)就像 Task.Delay() 之类的,可以在没有的情况下等待开始另一个线程。但我认为这是一种特殊情况,因为我没有为此编写代码。
对于想要从 GUI 线程中卸载一些他们自己的长时间运行的代码的普通用户来说,我们主要不是在谈论像 Task.Run 这样的事情来卸载我们的工作吗?线?如果是这样,为什么所有这些手臂都放弃不将异步与多线程混淆?