c#中异步和并行编程之间的关系是什么?
我感到困惑,因为异步编程是一种异步执行代码块的方法,它调用方法而不等待结果。 同样,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的。 所以想知道/混淆c#中这两种编程范式之间的关系是什么。
并行编程是一种我们使用多个线程更快地执行任务的技术。 这意味着在现代多核架构上,我们可以利用更多可用资源来执行任务。
一个很好的例子是使用quicksort对列表进行排序。
通常,并行编程性能很重要,所有线程都在努力实现共同目标。
异步编程略有不同。 这通常涉及更长时间运行的任务和任务,这些任务和任务可能正在等待某种外部刺激。 一个很好的例子是在后台线程中执行大型计算,以便UI保持响应。 对于异步代码,我们通常会讨论以与主应用程序不同的速率执行的代码。
并行编程意味着执行操作同时使用多个线程,处理cpu和/或内核。
您所说的异步编程意味着触发请求并提供回调机制来接收响应。
通常,异步意味着在可能的情况下执行,并行意味着通过创建新的执行线程立即执行。
这里的链接
最后:
使用CPU密集型解决方案的并行编程 。 使用IO Bound解决方案的异步编程 。
并行编程主要关注提高系统的性能。
异步编程主要关注提高系统的响应能力。
线程,任务等是实现异步和并行编程的技术。
我能够理解并行和异步编程的最简单的方法之一是考虑从Pluralsight采取的“煮鸡蛋”方案,我稍微改变了以包含线程。
并行编程
- 滚刀:CPU
- 多个花盆:线程
- 多个鸡蛋:并行任务
你有多个鸡蛋(任务)需要同时煮沸。 在这个例子中,滚刀将是CPU,每个煮沸一个鸡蛋的锅将是一个单独的线程,鸡蛋是并行的任务。 我可以通过在滚刀(CPU)上同时添加更多花盆(螺纹)来煮多个鸡蛋(任务)。 如果不使用并行编程,我一次只能煮1x鸡蛋(任务),因为你只需要1xjar(螺纹)就可以使用,这最终会减慢煮鸡蛋的过程。
异步编程
- Egg计时器:异步任务
- 滚刀:CPU
- 多个花盆:线程
- 多个鸡蛋:任务
继上面的例子之后,你现在决定只想知道所有的鸡蛋都煮沸了,而不是每个鸡蛋煮沸完毕。 为此,您将使用异步任务,在此实例中将作为egg计时器。 当所有鸡蛋(任务)完成时,鸡蛋计时器(异步任务)将更新你,所以你可以自由地做其他事情直到这一点。