什么是异步方法?我认为我知道,但我总是把它与并行混淆。我不确定异步方法和并行之间的区别。
另外,使用线程类和异步类有何区别?
编辑
演示异步、线程和并行之间差异的一些代码将会很有用。
什么是异步方法?我认为我知道,但我总是把它与并行混淆。我不确定异步方法和并行之间的区别。
另外,使用线程类和异步类有何区别?
编辑
演示异步、线程和并行之间差异的一些代码将会很有用。
当我们讨论潜在的耗时操作时,就会涉及到异步方法。通常情况下,我们需要这样的操作完成才能有意义地继续程序执行,但我们不想“暂停”直到操作完成(因为暂停可能会导致 UI 停止响应,这显然是不可取的)。
异步方法是一种我们调用以开始耗时操作的方法。该方法应该做必要的事情以启动操作,并"非常快"地返回结果,以避免任何处理延迟。
异步方法通常返回一个标记,调用者可以使用该标记查询操作是否已经完成以及其结果是什么。在某些情况下,它们接受回调(委托)作为参数;当操作完成时,回调被调用以向调用者发出信号,表明他们的结果准备就绪并将其传递回来。 这个 是一个常用的回调签名,当然在一般情况下回调可以看起来像任何形式。
我之前说过,异步方法启动了一个耗时的操作,但在这个上下文中,“启动”是什么意思呢?由于该方法立即返回结果,实际的工作在哪里执行?
一般情况下,一个执行线程需要监视该过程。由于不是调用异步方法的线程暂停,那么谁会暂停呢?答案是从托管线程池中选择出来的一个线程。
在这种情况下,“线程”指的是你显式地开启自己的线程并将其委托以同步方式执行相应的任务。该线程将会阻塞一段时间,并且可能会在操作完成时向您的“主”线程发出信号(这时主线程可以继续执行)。
这个指定的工作线程可能会被从线程池中取出(注意:在线程池线程中进行非常长时间的处理不推荐!)或者它可能是你为此目的启动的线程之一。
假设你需要打扫房子,做晚饭并哄孩子睡觉。
同步:
你先打扫房子,然后做晚饭,最后哄孩子睡觉。
并行:
你雇了3个人来分别打扫房子,做晚饭和哄孩子睡觉。但是你不相信他们,所以保持监督角色,观察他们并等待他们完成工作。只有当他们全部完成时,他们才会得到报酬。
异步:
你让一个孩子打扫房子,另一个孩子做晚饭。每个孩子完成自己的家务后,他们自己去睡觉,而你则坐在电视机前,轻松地品尝着一杯葡萄酒。