【发布时间】:2023-03-21 01:10:02
【问题描述】:
所以我最近一直在阅读大量关于网络 Async CTP 的内容,并且不断出现的一件事是这样的句子:“Asynchrony 不是关于启动新线程,而是关于多路复用工作”和“Asynchrony without多线程与 [与协作多任务处理] 的想法相同。您执行一项任务一段时间,当它产生控制权时,您在该线程上执行另一项任务一段时间。
我试图了解这样的言论是否纯粹(嗯,大部分)深奥和学术,或者是否有一些我忽略的语言结构允许我通过“等待”开始的任务神奇地在 UI 上运行线程。
在他的博客中,Eric Lippert 给出了这个例子来演示如何在没有多线程的情况下实现异步:
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 之类的事情来卸载我们的工作吗?它在另一个线程中?如果是这样,为什么所有这些手臂都放弃不将异步与多线程混淆?
【问题讨论】:
标签: c# asynchronous tap ctp