我对异步编程感到困惑,因为它是一种以异步方式执行代码块的方法,调用一个方法并不等待结果。同样地,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的。因此,我想知道在C#中这两种编程范例之间的关系是什么。
我对异步编程感到困惑,因为它是一种以异步方式执行代码块的方法,调用一个方法并不等待结果。同样地,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的。因此,我想知道在C#中这两种编程范例之间的关系是什么。
并行编程是一种技术,使用多个线程可以更快地执行任务。这意味着在现代的多核架构中,我们可以利用更多可用的资源来完成任务。
一个很好的例子是使用快速排序算法对列表进行排序。
通常情况下,在并行编程中,性能很重要,所有线程都在共同的目标上工作。
异步编程则有些微不同。它通常涉及运行时间较长的任务和等待某种外部刺激的任务。一个很好的例子是在后台线程中执行大量计算,以使用户界面保持响应。使用异步代码时,我们通常讨论的是以不同于主应用程序的速率执行的代码。
并行编程是指使用多个线程、进程、CPU或核心同时执行操作。
正如你所说的,异步编程意味着发出请求并提供回调机制以接收响应。
最后:
对于CPU密集型解决方案,请使用并行编程。 对于IO受限的解决方案,请使用异步编程。
并行编程主要关注系统性能的提升。
异步编程主要关注系统响应性的提升。
线程、任务等技术是实现异步和并行编程的方法。
我理解并掌握了并行和异步编程最简单的方法之一,就是通过来自Pluralsight的"煮鸡蛋"场景来思考。稍微改动了一下,加入了线程的概念。
并行编程
你有多个需要同时煮的鸡蛋(任务)。在这个例子中,炉灶就相当于CPU,每个煮一个鸡蛋的锅就是一个单独的线程,而鸡蛋就是并行任务。如果我想要同时煮多个鸡蛋(任务),我可以在炉灶(CPU)上同时添加更多的锅(线程)。如果没有使用并行编程,那么我只能同时煮一个鸡蛋(任务),因为只有一个锅(线程),这样的话就会拖慢整个煮蛋的过程。
异步编程
接着上面的例子,你现在想知道所有鸡蛋都煮好了,而不是每个单独的鸡蛋何时煮好。为了做到这一点,你可以使用异步任务,这个异步任务在这个场景中充当鸡蛋计时器的角色。鸡蛋计时器(异步任务)会在所有的鸡蛋(任务)完成后通知你,这样你就可以在这个时间点之前做其它事情了。