.net 如果没有线程或异步设备,异步/等待模式是否无关?
编辑-在阅读了下面的三个答案后,我意识到我在问废话!为浪费您的宝贵时间而道歉,并感谢您澄清了许多误解,真的!:) 我假设async/await和线程是类似问题的解决方案.net 如果没有线程或异步设备,异步/等待模式是否无关?,.net,multithreading,async-await,.net,Multithreading,Async Await,编辑-在阅读了下面的三个答案后,我意识到我在问废话!为浪费您的宝贵时间而道歉,并感谢您澄清了许多误解,真的!:) 我假设async/await和线程是类似问题的解决方案Async/await和Threads都解决了UI响应问题,但方式不同。前者是可以异步收集多个所需结果时使用的模式(例如,为了改善用户体验),因此它被称为“异步”。繁重的工作,那些需要几秒钟到几个小时的工作必须在另一个线程上卸载,以保持UI的响应性。这两个问题完全不同 无论我如何编辑这个问题,都无法询问这样的异步/等待,无论是否考
Async/await
和Threads
都解决了UI响应问题,但方式不同。前者是可以异步收集多个所需结果时使用的模式(例如,为了改善用户体验),因此它被称为“异步”。繁重的工作,那些需要几秒钟到几个小时的工作必须在另一个线程上卸载,以保持UI的响应性。这两个问题完全不同
无论我如何编辑这个问题,都无法询问这样的异步/等待,无论是否考虑线程问题,因为它们是完全不同的东西,可以一起使用(以多种方式)或单独使用。下面的声明2说明了这一切(除了一个“调用”的误解),但我从一开始就没有真正理解它的真正含义
我想我应该从我有疑问的那一刻就删除这个问题,但在真正阅读一些答案之前,我不知道这是一个多么愚蠢的问题。然而,这也可能有助于其他人更好地理解async/await是关于什么的
顺便说一句,我不知道该把什么答案标记为答案,因为他们都有宝贵的信息
原创帖子: 公平地说,我是“又一个异步/等待初学者”。然而,到目前为止,我所了解的是:
线程
!从未!它们与调用者在同一线程上运行线程中似乎失败。睡眠
(应使用任务。延迟
)或在异常
的情况下使用最终
块goto
形式,能够从一个方法步骤跳到另一个方法步骤,因为goto
调用可以“飞”(延迟)直到遇到等待!(很抱歉把事情简化了这么远)
我在没有额外线程的情况下测试了I/O和CPU代码,这两个线程都很重,并且都产生了无响应的UI,直到一切都完成
我的观察结果是:
没有异步功能,例如:
- 使用框架中众多
对象中的一个明确定义线程,或者使用它们自己创建线程的成员明确定义线程.net
- 或
,设计为从硬件级别(CPU)开始异步工作IO设备
async/await
只是简单的同步模式;也就是说,任何地方都没有类似异步的东西,只有async/await
关键字
问题是:上述观察是否属实,或者我是否遗漏了有关async/await
的一些重要内容
旁注: 我读过这篇文章(Stephen Cleary的博客中没有帖子)。他说没有线程(完全同意),但这与我的观察并不矛盾,即在没有异步设备的纯程序员代码级别上,除非您将繁重的任务委托给另一个线程,否则您无法拥有响应性UI。我关心的不是模式中等待的方面,正如我所说的,它就像一个飞行的goto;我想确保我不是为了使用新的东西而盲目地使用
async/wait
.ConfigureAwait(false)
:在我看来,这似乎涉及到一个线程池,这就是为什么UI线程仍然具有响应性…这里有两个不同的概念,您正在混淆。异步和并行不是一回事。虽然异步操作可以隐藏多线程,但它们不一定这样做
C#中的async
/await
关键字只是表达“当操作A完成时,执行操作B”之类想法的语法糖分。操作是否在另一个线程上运行是一个您不关心的实现细节
基本上,您可以让编译器和框架为您解决这个问题
仔细想想,
async
/await
在概念上与事件和事件循环的工作方式有些相似。也许事件
语法不够灵活,这就是他们引入这些新关键字的原因。我个人认为,这与JavaScript中的承诺或者Node.js中事件循环的工作原理是一样的。我不是说它的工作原理类似,但它确实解决了非常类似的问题。Async await是一种模式,允许您编写与同步代码非常相似的代码,但实际上可以异步执行。这依赖于编译器所做的大量工作。就这些
Async await不创建异步操作,它只允许您以简单的方式使用它们,并且仍然是异步的,这与使用BeginXXX
/EndXXX
之前不同
异步确实对I/O最有用,因为大多数异步操作都是I/O操作,但也有不同的操作,如Task.Delay