C#中异步编程和并行编程之间的关系是什么?

27

我对异步编程感到困惑,因为它是一种以异步方式执行代码块的方法,调用一个方法并不等待结果。同样地,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的。因此,我想知道在C#中这两种编程范例之间的关系是什么。


这其实是同一件事,只是用了不同的术语。 - Andrew Walters
那么在C# 4.5中使用async和await实现的异步编程也可以被视为并行编程吗? - Alagesan Palani
我会说是的。并行编程是指以一种方式编码,使您可以将问题分解为n个部分,您可以在m个线程上扩展您的算法,并以更高效的方式解决它。 - Andrew Walters
4
@AlagesanPalani - 不是这样的,如果你这样想,它会对你造成很大的影响。在 .Net 中,异步编程意味着线程共享。这是通过回调和事件循环实现的。并行编程通常涉及操作系统构造并发性。Node.js 是异步编程的一个很好的例子。它是单线程的,但所有 IO 操作都是异步的。 - Josh
6个回答

34

并行编程是一种技术,使用多个线程可以更快地执行任务。这意味着在现代的多核架构中,我们可以利用更多可用的资源来完成任务。

一个很好的例子是使用快速排序算法对列表进行排序。

通常情况下,在并行编程中,性能很重要,所有线程都在共同的目标上工作。

异步编程则有些微不同。它通常涉及运行时间较长的任务和等待某种外部刺激的任务。一个很好的例子是在后台线程中执行大量计算,以使用户界面保持响应。使用异步代码时,我们通常讨论的是以不同于主应用程序的速率执行的代码。


19

并行编程是指使用多个线程、进程、CPU或核心同时执行操作。

正如你所说的,异步编程意味着发出请求并提供回调机制以接收响应。


12

最后:

对于CPU密集型解决方案,请使用并行编程。 对于IO受限的解决方案,请使用异步编程


7
一般来说,异步执行意味着尽可能地在任何时候执行,而并行执行则是立即创建一个新的执行线程进行执行。
这里是链接。

感谢您的回复,我正在测试我们的一个Web API上的GET请求,并非常困惑地发现1000个并行请求比仅有一个异步请求更快。 - Narish

4

并行编程主要关注系统性能的提升。

异步编程主要关注系统响应性的提升。

线程、任务等技术是实现异步和并行编程的方法。


2

我理解并掌握了并行和异步编程最简单的方法之一,就是通过来自Pluralsight的"煮鸡蛋"场景来思考。稍微改动了一下,加入了线程的概念。

并行编程

  • 炉灶:CPU
  • 多个锅:线程
  • 多个鸡蛋:并行任务

你有多个需要同时煮的鸡蛋(任务)。在这个例子中,炉灶就相当于CPU,每个煮一个鸡蛋的锅就是一个单独的线程,而鸡蛋就是并行任务。如果我想要同时煮多个鸡蛋(任务),我可以在炉灶(CPU)上同时添加更多的锅(线程)。如果没有使用并行编程,那么我只能同时煮一个鸡蛋(任务),因为只有一个锅(线程),这样的话就会拖慢整个煮蛋的过程。

异步编程

  • 鸡蛋计时器:异步任务
  • 炉灶:CPU
  • 多个锅:线程
  • 多个鸡蛋:任务

接着上面的例子,你现在想知道所有鸡蛋都煮好了,而不是每个单独的鸡蛋何时煮好。为了做到这一点,你可以使用异步任务,这个异步任务在这个场景中充当鸡蛋计时器的角色。鸡蛋计时器(异步任务)会在所有的鸡蛋(任务)完成后通知你,这样你就可以在这个时间点之前做其它事情了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接