gpt4 book ai didi

.net - 在没有线程或异步设备的情况下,异步/等待模式是否无关紧要?

转载 作者:行者123 更新时间:2023-12-02 06:55:07 25 4
gpt4 key购买 nike

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

我假设apples and pipe wrenches在异步/等待和线程解决类似问题的方式上是同一回事。 Async/awaitThreads都处理UI响应性,但不是以相同的方式。前者是一种模式,当可以异步收集多个所需结果时(例如,为了改善用户体验),将使用这种模式,因此将其称为“异步”。繁重的工作,需要花费几秒钟到几小时的工作,必须卸载到另一个线程上,以保持UI响应速度。这两个是完全不同的关注点。

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

我想我应该从怀疑的那一刻起就删除该问题,但是在实际阅读一些答案之前,我无法理解这是一个愚蠢的问题。但是,这也可能有助于其他人更好地了解异步/等待的含义。

顺便说一句,我不知道将什么答案标记为答案,因为它们都有有值(value)的信息。

原始帖子:

可以公平地说,我是“另一个异步/等待初学者”。但是,到目前为止,我了解的是:

  • async/await不会创建threads!绝不 !它们在与调用方相同的线程上运行。
  • async/await不是并行任务。他们只是定义了一种模式,在调用者级别调用await时,将执行异步代码块(或者-我知道我的理解有点错误,但这是我可以清楚地看到它的方式)
  • 如果该代码块不包含await关键字,则不会异步执行该代码块。
  • async/await似乎可以很好地与某些I/O任务配合使用,但是在大多数高CPU计算中似乎并不那么出色。
  • async/await似乎因Thread.Sleep而失败(应改用Task.Delay),或者如果ExceptionFinally块一起使用,则失败。

  • 基于上述内容,并且为了简化起见,我认为async/await只是 goto 的一种改进形式,能够从一个方法步骤跳转到另一个方法步骤,因为 goto调用可以“飞行”(延迟)直到遇到一个等待! (很抱歉,目前为止无法简化)

    我已经在没有额外线程的情况下测试了I/O和CPU代码,而且线程繁重,并且都生成了 无响应 UI,直到一切完成。

    我的观察站是:

    如果没有异步功能,例如:

    使用框架中众多 .net对象之一或其在自己的上创建线程的成员显式定义的
  • 线程
    旨在从一开始就在硬件级别(CPU)异步运行的
  • IO devicesasync/await只是普通的同步模式;意思是,只有async/await关键字在任何地方都没有类似异步的东西。

    The question is: is the above observation true, or am I missing some important thing about async/await ?



    注意事项:

    我已经读过这个blog post(没有线程,Stephen Cleary的博客)。他指出,没有线程(完全同意),但是这与我的观察结果并不矛盾,因为在不涉及异步设备的情况下,在纯程序员代码级别上,除非您在另一个线程中委派繁重的任务,否则您将没有响应式UI。我所关心的不是模式的等待方面,就像我说的那样,就像飞翔的goto。我想确保我不会只是为了使用新的东西而盲目地使用async/await
    .ConfigureAwait(false):对我来说似乎涉及ThreadPool,这就是UI线程仍然响应的原因。

  • 最佳答案

    Async-await是一种模式,允许您编写与同步代码极为相似但实际上可以异步执行的代码。这依赖于编译器完成的许多工作。就这样。

    Async-await不会创建异步操作,它仅允许您以简单的方式使用它们,并且仍然是异步的,这与使用BeginXXX/EndXXX之前的操作不同。

    的确,异步对于I/O最为有用,因为大多数异步操作都是I/O操作,但是还有其他不同的操作,例如Task.Delay,异步同步机制或异步等待事件。

    关于您的特定要点:

  • 异步等待未创建线程。异步方法开始在调用者线程上运行,请勿将用于任何线程进行实际的异步操作,并在ThreadPool线程或SynchronizationContextTaskScheduler定义的线程上恢复。
  • 没有调用
  • Await。当异步方法等待未完成的任务时,该方法的其余部分将作为该任务完成时将要运行的继续进行调度。
  • 差不多。您需要等待异步操作,异步方法才能异步进行。
  • Async-await可以同时使用。如果您的操作不是异步的,那么使用async-await没有任何意义。
  • Async-await不会因Thread.Sleep而失败。使用Thread.Sleep只是浪费,因为它阻塞了一个线程。这就是为什么您使用Task.Delay的原因。您现在可以使用C#6在finally中等待。

  • 最后:

    meaning, there is no asynchronous-like thing anywhere with just async/await keywords.



    是的,使用 async关键字标记方法不会使任何内容异步运行。它仅允许您使用 await并将结果包装在 Task中。

    关于.net - 在没有线程或异步设备的情况下,异步/等待模式是否无关紧要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222267/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com