当前位置: 首页 > 知识库问答 >
问题:

异步方法不需要额外的线程?

岳和泽
2023-03-14

在MSDN中,有这样一段话:

但我不知道加粗文字的确切含义,所以我似乎不需要更多的帮助。那么,为什么它在不使用线程的情况下变为异步呢?

来源:http://msdn.microsoft.com/en-us/library/hh191443.aspx

共有3个答案

微生俊健
2023-03-14

不是async和wait关键字本身生成的代码,不是。他们创建在您的当前线程上运行的代码,假设它有同步上下文。如果没有,那么您实际上确实获得了线程,但这是毫无理由地使用模式。wait表达式,您在wait关键字右侧编写的内容会导致线程运行。

但该线程通常是不可见的,它可能是一个设备驱动程序线程。报告它是通过I/O完成端口完成的。很常见,I/O总是使用WAIT的一个很好的理由。如果WinRT尚未强制您,那么添加了async/await的真正原因。

关于“具有同步上下文”的说明。如果SynChronizationContext,您在线程上有一个。当前属性不为空。这几乎只在gui应用程序的主线程上出现过。也是您通常担心延迟而不冻结用户交互界面的唯一地方。

胡承悦
2023-03-14

异步/等待不仅仅是使用更多线程。这是关于如何更有效地使用现有线程的问题。当操作阻塞时,例如等待下载或文件读取,异步/等待模式允许您将现有线程用于其他用途。编译器处理下面的所有神奇管道,使其更易于开发。

看见http://msdn.microsoft.com/en-us/magazine/hh456401.aspx有关问题描述和白皮书,请访问http://www.microsoft.com/en-us/download/details.aspx?id=14058.

柯良骏
2023-03-14

有许多异步操作不需要使用多个线程。像异步IO这样的东西是通过在数据可用时发出中断信号来工作的。这允许您进行不使用额外线程的异步调用——当信号发生时,操作完成。

任务。Run可以用来创建自己的基于CPU的异步方法,该方法将在自己的单独线程上运行。然而,这一段意在表明,这并不是唯一的选择。

 类似资料:
  • 我有一组从基类继承的命令。基类有以下声明: 此异步方法缺少“await”运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。 显式提供任务完成返回值是否正确?

  • 我正在为一个大型应用程序编写自动化测试。这些测试中的一些很容易成为<code>异步,它只提供<code>async 测试应用程序的一些关键方面如下: 这是一个巨大的ASP.NET应用程序(尽管代码在通过单元测试执行时没有在ASP.NET上下文中运行)。 在其核心中,它严重依赖于每个线程缓存上下文信息(例如活动用户的整个权限方案)的静态对象。 现在,我的问题是当在方法中使用时,延续可能发生在与以前不

  • 我很困惑。一个或多个怎么能在单个线程上并行运行?我对并行性的理解显然是错误的。 一些我无法理解的MSDN: 异步和等待关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不会在自己的线程上运行。该方法在当前同步上下文上运行,并且仅在方法处于活动状态时才在线程上使用时间。 .. 以及: 在启动任务和等待任务之间,您可以启动其他任务。其他任务隐式并行运行,但不会创建其他线程。

  • 我最近一直在研究Spring集成和AMQP(RabbitMQ),因为我需要用异步方法通信两个应用程序(中间件和后端),这样中间件在接收客户端调用时就不会阻塞。 我首先采用了一种更简单的方法,以同步方式实现这一点,这意味着我在中间件上有一个网关接口和一个出站网关(requiresReply=true),然后在后端有一个入站网关和一个服务激活器。这种初始方法工作得很好(我使用了Spring集成XML配

  • 我正在为PoC点构建我的dotnet core webapi服务,我关心的是为其他ARCH/Devs提供适当的指导。 “相同”方法签名的变化很少 公共动态获取(字符串名称=_defaultName) 公共IActionResult Get(字符串名称=_DefaultName) 获取公共异步任务(字符串名称=_defaultName) 撇开我为什么使用动态类型而不是自定义类型的讨论不谈,我试图理解

  • 本文向大家介绍C#异步编程几点需要注意的地方,包括了C#异步编程几点需要注意的地方的使用技巧和注意事项,需要的朋友参考一下 尽量不要编写返回值类型为void的异步方法 在通常情况下,建议大家不要编写那种返回值类型为void的异步方法,因为这样做会破坏该方法的启动者与方法本身之间的约定,这套约定本来可以确保主调方能够捕获到异步方法所发生的异常。 正常的异步方法是通过它返回的Task对象来汇报异常的。