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

关于线程和异步方法在C#中是否真的是异步的混淆

廖招
2023-03-14

如果我有一个长时间运行的任务是CPU绑定的(假设它正在进行大量困难的数学运算),那么异步运行该任务一定会阻塞某个线程,对吗?必须要做些实际的计算。如果我等待它,那么某些线程将被阻塞。

一个真正的异步方法的例子是什么?它们实际上是如何工作的?这些操作是否仅限于利用某些硬件功能的I/O操作,从而不会阻塞任何线程?

共有1个答案

郜琦
2023-03-14

这对我来说有点不清楚,可能是因为我头脑中对异步的定义不一致。

很高兴你要求澄清。

在我看来,由于我主要是做UI开发,所以异步代码不是在UI线程上运行的代码,而是在其他线程上运行的代码。

如果我等待它,那么某些线程将被阻塞。

不不不。这是你误解中最重要的部分。await不表示“异步启动此作业”。Await的意思是“这里有一个异步生成的结果可能不可用。如果不可用,请在此线程上查找其他工作,这样我们就不会阻塞线程。Await与您刚才所说的相反。

一个真正的异步方法的例子是什么?它们实际上是如何工作的?这些操作是否仅限于利用某些硬件功能的I/O操作,从而不会阻塞任何线程?

 类似资料:
  • 在这个msdn页面上,我读到: 应用程序不能为特定请求混合同步和异步方法。如果调用BeginGetRequestStream方法,则必须使用BeginGetResponse方法检索响应。 反之亦然吗?如果调用异步读取响应,是否还应该使用编写请求? 我的请求很小(100-1000个字符),响应可以很大。Jeffrey Richter的这篇文章似乎是说,在小负载的情况下,它可以同步完成(并且不需要设置

  • 我正在使用Kafka客户端1.0.0库中的KafkaProducer,根据文档,该方法是

  • 我们正在尝试使用 guzzle 执行并发异步请求。在浏览了一些资源(例如这样和这样)之后,我们提出了一些在下面共享的代码。但是,它没有按预期工作。 看起来Guzzle正在同步而不是异步地处理这些请求。 出于测试目的,我们点击一个内部url,它会Hibernate5秒钟。当并发数为10时,我们预计所有10个请求最初将被排队并几乎同时发送到服务器,在那里它们将等待5秒钟,然后几乎所有的请求将几乎同时完

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

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

  • 我希望我的请求触发一些长时间运行的操作,这些操作应该在后台执行。我编写了以下实现,应该在后台处理我的操作,但实际上我的请求是同步执行的: 在日志中,我看到以下内容: 我看到我的在另一个线程中执行,但出于某种原因,我的原始请求等待sleep完成 更新1: