17

What is an asynchronous method. I think I know, but I keep confusing it with parallelism. I'm not sure what the difference between an asynchronous method is and what parallelism is.

Also what is difference between using threading classes and asynchronous classes?

EDIT

Some code demonstrating the difference between async, threading and parallelism would be useful.

4

4 回答 4

25

什么是异步方法?

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

异步方法是我们调用以启动冗长操作的方法。该方法应该执行启动操作所需的操作并“非常快速地”返回,以便没有处理延迟。

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

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

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

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

跟线程有什么关系?

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

这个指定的工作线程可能会被拉出线程池(注意:不建议在线程池线程中进行非常冗长的处理!)或者它可能是为此目的而启动的。

于 2013-04-18T13:08:49.690 回答
20

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

一个方法是同步的,如果为了使用该方法——为了获得副作用或结果——你的线程必须从你请求完成工作的那一点到它完成的那一点不做任何其他事情。

如果您的线程告诉该方法它需要完成工作,并且该方法说“好的,我会这样做,完成后我会打电话给您”,则该方法是异步的。

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

那有意义吗?

于 2013-04-18T13:57:47.983 回答
10

假设你需要打扫房子,做饭,让孩子们上床睡觉。

同步:

你打扫房子,然后做饭,然后让孩子们上床睡觉。

平行:

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

异步:

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

于 2013-04-18T13:33:37.320 回答
1

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

于 2013-04-18T13:12:10.143 回答