.net 如果没有线程或异步设备,异步/等待模式是否无关?

.net 如果没有线程或异步设备,异步/等待模式是否无关?,.net,multithreading,async-await,.net,Multithreading,Async Await,编辑-在阅读了下面的三个答案后,我意识到我在问废话!为浪费您的宝贵时间而道歉,并感谢您澄清了许多误解,真的!:) 我假设async/await和线程是类似问题的解决方案Async/await和Threads都解决了UI响应问题,但方式不同。前者是可以异步收集多个所需结果时使用的模式(例如,为了改善用户体验),因此它被称为“异步”。繁重的工作,那些需要几秒钟到几个小时的工作必须在另一个线程上卸载,以保持UI的响应性。这两个问题完全不同 无论我如何编辑这个问题,都无法询问这样的异步/等待,无论是否考

编辑-在阅读了下面的三个答案后,我意识到我在问废话!为浪费您的宝贵时间而道歉,并感谢您澄清了许多误解,真的!:)

我假设async/await和线程是类似问题的解决方案
Async/await
Threads
都解决了UI响应问题,但方式不同。前者是可以异步收集多个所需结果时使用的模式(例如,为了改善用户体验),因此它被称为“异步”。繁重的工作,那些需要几秒钟到几个小时的工作必须在另一个线程上卸载,以保持UI的响应性。这两个问题完全不同

无论我如何编辑这个问题,都无法询问这样的异步/等待,无论是否考虑线程问题,因为它们是完全不同的东西,可以一起使用(以多种方式)或单独使用。下面的声明2说明了这一切(除了一个“调用”的误解),但我从一开始就没有真正理解它的真正含义

我想我应该从我有疑问的那一刻就删除这个问题,但在真正阅读一些答案之前,我不知道这是一个多么愚蠢的问题。然而,这也可能有助于其他人更好地理解async/await是关于什么的

顺便说一句,我不知道该把什么答案标记为答案,因为他们都有宝贵的信息


原创帖子

公平地说,我是“又一个异步/等待初学者”。然而,到目前为止,我所了解的是:

  • 异步/等待不会创建
    线程
    !从未!它们与调用者在同一线程上运行
  • 异步/等待不是并行任务。它们只是定义了一种模式,在调用方级别调用wait时,异步代码块就会被执行(或者说——我知道我的理解有点错误,但这就是我可以清楚地在脑海中描绘它的方式)
  • 如果代码块不包含wait关键字,则不会异步执行该代码块
  • async/await似乎在某些I/O任务中工作得很好,但在大多数高CPU计算中似乎没有那么出色
  • 异步/等待在
    线程中似乎失败。睡眠
    (应使用
    任务。延迟
    )或在
    异常
    的情况下使用
    最终
  • 基于以上,为了简化事情,我认为async/await只是一种改进的
    goto
    形式,能够从一个方法步骤跳到另一个方法步骤,因为
    goto
    调用可以“飞”(延迟)直到遇到等待!(很抱歉把事情简化了这么远)

    我在没有额外线程的情况下测试了I/O和CPU代码,这两个线程都很重,并且都产生了无响应的UI,直到一切都完成

    我的观察结果是:

    没有异步功能,例如:

    • 使用框架中众多
      .net
      对象中的一个明确定义线程,或者使用它们自己创建线程的成员明确定义线程
    • IO设备
      ,设计为从硬件级别(CPU)开始异步工作
    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