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

“异步”是否在单独的线程中运行?[重复]

锺离嘉容
2023-03-14

当我调用foo()时,这个方法是否在单独的线程上运行?

public async Task<bool> foo(){
  //Some code 
}

共有3个答案

松钊
2023-03-14

不,这些任务并不意味着有一个单独的线程在运行。如果您的任务需要在其方法体中阻止另一个异步任务,它可以在等待被阻止的资源时临时返回执行,然后返回执行以完成任务。这就是wait关键字的基本用途。典型的异步任务是在真正的异步操作开始后等待I/O或网络资源返回数据的任务。您的方法本身也可能产生自己的线程,使其异步,但这实际上只取决于异步方法本身的实现。

在这一页的“烹饪早餐类比”中可以找到一个很好的解释:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

请注意,可以并行运行任务,这可以生成单独的线程,但当您直接调用这些方法时,默认情况下不会这样做。

高嘉树
2023-03-14

将该方法设置为异步并不意味着它将创建另一个线程。如果CLR看到在异步方法中用wait调用的方法被延迟,它将退出该方法并在wait方法完成后等待,然后用另一个线程继续该方法。

当调用标记为async的方法时,它开始在当前线程上同步运行。

因此,结论是异步并不创建自己的线程。调用方法的线程用于执行异步方法,直到找到一个可等待的。然后,同一线程继续执行异步方法调用之外的其余调用方法。在被调用的async方法中,从waitible返回后,可以在线程池中的线程上执行continuation,这是唯一一个单独线程出现的地方。

令狐献
2023-03-14

不,没有。它可以在内部启动另一个线程并返回该任务,但一般的想法是它不会在任何线程上运行。

让我解释一下。异步的一般用途是,如果您没有CPU限制,这意味着IO和windows中的所有IO都在最低级别具有回调操作接口,因此-网络请求发送请求,然后继续工作-但没有附加线程。完全async的一般用例是async在线程上运行,当无需执行任何操作时,它将使用线程完成任务,允许在一个线程上执行多个操作,并且。。。IO不会耗尽线程。

您的方法基本上变成了一个状态引擎,将控制权交给任务调度器,等待发出完成任务的信号。

 类似资料:
  • 我正在探索使用Spring Boot的异步servlet。据我所知,异步servlet用于在一个线程中执行长时间运行的任务,而不是容器为处理请求而启动的线程,这样容器就可以使用自己的线程来处理其他连接。基于这样的理解,我尝试了以下代码: 但问题是,运行的同一线程正在调用方法。不是应该不一样吗?

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 前言 面试时,关于同步和异步,可能会问以下问题: 同步和异步的区别是什么?分别举一个同步和异步的例子 一个关于 setTimeout 的笔试题 前端使用异步的场景哪些? 面试时,关于js运行机制,需要注意以下几个问题: 如何理解JS的单线程 什么是任务队列 什么是 EventLoop 理解哪些语句会放入异步任务队列 理解语句放入异步任务队列的时机 JS的异步和单线程 因为是单线程,所以必须异步。

  • 如果我有一个长时间运行的任务是CPU绑定的(假设它正在进行大量困难的数学运算),那么异步运行该任务一定会阻塞某个线程,对吗?必须要做些实际的计算。如果我等待它,那么某些线程将被阻塞。 一个真正的异步方法的例子是什么?它们实际上是如何工作的?这些操作是否仅限于利用某些硬件功能的I/O操作,从而不会阻塞任何线程?

  • 我有一个java maven项目,我希望使用多线程进行测试。我在src/test中有testng.xml,maven surefire插件被配置为使用它。就像这个页面一样:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 编辑:增加了一定的pom条目

  • 我创建了一个多线程步骤,最大线程限制为10; 在处理了200万条记录文件后,我可以在日志文件中看到创建的线程太多,即使我将限制设置为10个线程。你能告诉我为什么吗?非常感谢。 2019-07-02T17:02:298968129857信息[batch-thread35348]com。db。wmdl。价格档案。工作一批听众。PriceFileReaderListener([])-PriceFileR