【发布时间】:2013-04-11 14:33:54
【问题描述】:
什么是异步方法。我想我知道,但我一直把它与并行性混淆。我不确定异步方法和并行性之间的区别是什么。
另外,使用线程类和异步类有什么区别?
编辑
一些演示异步、线程和并行之间区别的代码会很有用。
【问题讨论】:
-
您是否询问在单独线程中执行 I/O 与使用 I/O Completion Ports 的异步模式之间的区别?
标签: c# asynchronous
什么是异步方法。我想我知道,但我一直把它与并行性混淆。我不确定异步方法和并行性之间的区别是什么。
另外,使用线程类和异步类有什么区别?
编辑
一些演示异步、线程和并行之间区别的代码会很有用。
【问题讨论】:
标签: c# asynchronous
当我们谈论潜在的冗长操作时,我们会讨论异步方法。通常,我们需要完成这样的操作才能有意义地继续程序执行,但我们不想“暂停”直到操作完成(因为暂停可能意味着 UI 停止响应,这显然是不可取的)。
异步方法是我们调用以开始冗长操作的方法。该方法应该执行启动操作所需的操作并“非常快”地返回,这样就不会出现处理延迟。
异步方法通常会返回一个令牌,调用者可以使用该令牌来查询操作是否已完成以及它的结果是什么。在某些情况下,他们将回调(委托)作为参数;当操作完成时,回调被调用以通知调用者他们的结果已经准备好并将它们传回。 This 是一个常用的回调签名,当然一般回调可以看起来像任何东西。
我在上面说过异步方法启动一个长度操作,但在这种情况下“开始”是什么意思?既然方法是立即返回的,那么实际的工作是在哪里完成的呢?
在一般情况下,执行线程需要监视进程。既然不是调用异步方法的线程暂停了,谁来做?答案是,为此目的从managed thread pool 中挑选了一个线程。
在这种情况下,我对“线程”的解释只是您明确启动自己的线程并将其委派以同步执行相关任务。该线程将阻塞一段时间,并且可能会在操作完成时向您的“主”线程(可以继续执行)发出信号。
这个指定的工作线程可能是pulled out of the thread pool(注意:不建议在线程池线程中进行非常冗长的处理!)或者它可能是一个you started,只是为了这个目的。
【讨论】:
首先,什么是方法,什么是线程?方法是一个工作单元,它要么 (1) 执行有用的副作用,例如写入文件,要么 (2) 计算结果,例如制作分形的位图。线程是执行该工作的 worker。
一个方法是同步的,如果为了使用该方法——为了获得副作用或结果——你的线程必须什么都不做您要求将工作完成到完成为止。
一个方法是异步如果你的线程告诉方法它需要完成工作,并且方法说“好的,我会做的,当它完成时我会打电话给你完成的”。
通常异步方法的做法是制造另一个工人——它从池中获取一个线程。如果该方法需要大量使用 CPU,则尤其如此。但不总是; 要求异步方法启动另一个线程。
这有意义吗?
【讨论】:
假设你需要打扫房子、做饭和哄孩子睡觉。
同步:
你打扫房子,然后做饭,然后哄孩子睡觉。
平行:
你雇了 3 个人来打扫房子、做饭和哄孩子睡觉。但是你不信任他们,所以保持监督角色,看着他们并等待他们完成。只有当他们全部完成后才能获得报酬。
异步:
你一个孩子打扫房子,另一个孩子做饭。当每个人都做完家务后,他们就上床睡觉了,而你则在电视机前端起一杯酒。
【讨论】:
首先你要明白,如果你想要并行,所有的结构都需要并行,我的意思是,如果你有一个异步方法,你就需要一个异步调用。 在 Web 服务或 Web 内容中,可以使用异步的 AJAX 调用异步方法(只是其中一种方法)。在一种方法中,您可以拥有多个线程,这是异步方法和多线程之间的主要区别。 最主要的是:标准方法和异步方法之间的区别在于,如果您同时对具有异步调用者(如 AJAX)的同一个控制器对标准方法进行 2 次调用,则第二次调用将在第一次调用时开始调用已经完成,如果您调用的方法是异步的,则两个调用将同时开始,对于多核服务器,它可以达到标准速度的两倍(2 次调用)。 并行度的速度就是用这个law来衡量的。
【讨论】: