【问题标题】:What does it mean for a method to be asynchronous?方法是异步的意味着什么?
【发布时间】:2013-04-11 14:33:54
【问题描述】:

什么是异步方法。我想我知道,但我一直把它与并行性混淆。我不确定异步方法和并行性之间的区别是什么。

另外,使用线程类和异步类有什么区别?

编辑

一些演示异步、线程和并行之间区别的代码会很有用。

【问题讨论】:

标签: c# asynchronous


【解决方案1】:

什么是异步方法?

当我们谈论潜在的冗长操作时,我们会讨论异步方法。通常,我们需要完成这样的操作才能有意义地继续程序执行,但我们不想“暂停”直到操作完成(因为暂停可能意味着 UI 停止响应,这显然是不可取的)。

异步方法是我们调用以开始冗长操作的方法。该方法应该执行启动操作所需的操作并“非常快”地返回,这样就不会出现处理延迟。

异步方法通常会返回一个令牌,调用者可以使用该令牌来查询操作是否已完成以及它的结果是什么。在某些情况下,他们将回调(委托)作为参数;当操作完成时,回调被调用以通知调用者他们的结果已经准备好并将它们传回。 This 是一个常用的回调签名,当然一般回调可以看起来像任何东西。

那么,究竟是谁在运行这个冗长的操作呢?

我在上面说过异步方法启动一个长度操作,但在这种情况下“开始”是什么意思?既然方法是立即返回的,那么实际的工作是在哪里完成的呢?

在一般情况下,执行线程需要监视进程。既然不是调用异步方法的线程暂停了,谁来做?答案是,为此目的从managed thread pool 中挑选了一个线程。

跟线程有什么关系?

在这种情况下,我对“线程”的解释只是您明确启动自己的线程并将其委派以同步执行相关任务。该线程将阻塞一段时间,并且可能会在操作完成时向您的“主”线程(可以继续执行)发出信号。

这个指定的工作线程可能是pulled out of the thread pool(注意:不建议在线程池线程中进行非常冗长的处理!)或者它可能是一个you started,只是为了这个目的。

【讨论】:

  • 除了异步处理的一大优势是它实际上不会阻塞任何线程。
  • @svick:这最终将取决于操作系统提供的操作和相关设施。然而,阻塞部分与讨论并没有真正密切相关,所以我在其他几件事中编辑了它。感谢您的参与。
【解决方案2】:

首先,什么是方法,什么是线程?方法是一个工作单元,它要么 (1) 执行有用的副作用,例如写入文件,要么 (2) 计算结果,例如制作分形的位图。线程是执行该工作的 worker

一个方法是同步的,如果为了使用该方法——为了获得副作用或结果——你的线程必须什么都不做您要求将工作完成到完成为止。

一个方法是异步如果你的线程告诉方法它需要完成工作,并且方法说“好的,我会做的,当它完成时我会打电话给你完成的”。

通常异步方法的做法是制造另一个工人——它从池中获取一个线程。如果该方法需要大量使用 CPU,则尤其如此。但不总是; 要求异步方法启动另一个线程。

这有意义吗?

【讨论】:

    【解决方案3】:

    假设你需要打扫房子、做饭和哄孩子睡觉。

    同步:

    你打扫房子,然后做饭,然后哄孩子睡觉。

    平行:

    你雇了 3 个人来打扫房子、做饭和哄孩子睡觉。但是你不信任他们,所以保持监督角色,看着他们并等待他们完成。只有当他们全部完成后才能获得报酬。

    异步:

    你一个孩子打扫房子,另一个孩子做饭。当每个人都做完家务后,他们就上床睡觉了,而你则在电视机前端起一杯酒。

    【讨论】:

    • 最后一段很有趣,但可能更准确。我会说“异步”是“你把水烧开,当它沸腾时你有时间拿起地板上的外套。然后把面条在水里,然后你有时间开始洗衣服。然后在洗衣服的时候你可以吃晚饭。然后你可以让孩子们睡觉,然后把房子打扫完。异步的要点是你将工作分成小部分,这样你就可以在等待高延迟操作的同时做其他事情。
    • 是的,但重点是,并行,主线程等待子线程完成后再继续。异步的子线程工作,而主线程做它自己的事情。 (用最简单的说法!):)
    • @anothershrubery 不,这不是真的。首先,您可以让主线程在并行环境中工作。您甚至可以让主线程不观察并行环境中的其他线程。并行化意味着有不止一件事在工作,不多也不少。异步意味着开始工作,做其他事情,然后根据之前开始的工作结果可能做一些事情。这可能涉及并行化,但也可能不涉及,如 Eric 的示例所述。你可以异步做家务,但不能并行。
    • @Servy:或者,另一个经典的例子:怀孕期间你仍然可以工作,但九个女人不能在一个月内聚在一起生孩子。该操作是异步的——您可以在等待结果的同时执行其他操作——但它不是可并行化——任务的某些部分不能轻易地外包给独立的工作人员。跨度>
    【解决方案4】:

    首先你要明白,如果你想要并行,所有的结构都需要并行,我的意思是,如果你有一个异步方法,你就需要一个异步调用。 在 Web 服务或 Web 内容中,可以使用异步的 AJAX 调用异步方法(只是其中一种方法)。在一种方法中,您可以拥有多个线程,这是异步方法和多线程之间的主要区别。 最主要的是:标准方法和异步方法之间的区别在于,如果您同时对具有异步调用者(如 AJAX)的同一个控制器对标准方法进行 2 次调用,则第二次调用将在第一次调用时开始调用已经完成,如果您调用的方法是异步的,则两个调用将同时开始,对于多核服务器,它可以达到标准速度的两倍(2 次调用)。 并行度的速度就是用这个law来衡量的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2020-05-03
      • 2011-06-28
      • 2014-02-23
      • 1970-01-01
      • 2011-02-16
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多