c#中multithreading和异步程序的区别

我最初在Stackoverflow和谷歌搜索了类似的问题。 只有一个链接提供了一些观点,但我无法理解清楚。 [ 1 ]

以下问题困扰着我:

  1. 在异步编程中,什么是真正的Callback方法? 代表?

  2. 异步程序的实现是使用multithreading?

如果提供图形解释,我将非常感激


[ 1 ] “multithreading和异步编程之间的区别”

1)回调基本上是传递给过程的委托,该过程将在某个适当的点“回调”。 例如,在诸如WebRequest.BeginGetResponse或WCF BeginXxx操作的异步调用中,您将传递AsyncCallback。 工作人员将“回调”您传入的任何方法作为AsyncCallback,在这种情况下,当它完成时让您知道它已完成并获得结果。

2)multithreading是程序运行的不同部分,通常称为线程。

异步编程使用线程来启动一段代码。 所以异步编程依赖于multithreading来工作。 请参阅以下链接:

异步编程和multithreading

multithreading和异步编程之间的区别

单螺纹堵塞

要理解异步/并发/multithreading,我们需要从最基础的开始,为什么我们为这个问题添加了如此多的复杂性。

最初只有单线程阻塞应用程序。 这些都是非常简单的程序,而且很可能,这些正是您现在正在编写的内容。

为了解释,我将使用比萨饼屋的比喻。

想象一下,您的计算机是一个拥有一名员工的披萨店。 他只接受过基础训练。

您走进商店,与员工交谈,查看菜单并订购披萨。

大。 员工走进商店的后面,在里面放一个比萨饼,站在烤箱旁边等着披萨做饭

你记得你的妻子不喜欢菠萝。 你对那个试图引起他注意改变你的订单的员工大喊大叫。 没有骰子。 他不会离开烤箱(他睡着了)。

你生气了,离开了。

multithreading并发阻塞

你去了下一家披萨店。

它有4名员工。

您走进商店,与员工交谈,查看菜单并订购披萨。

他向后面的其他员工大喊(发送信息)给你做披萨。 他们把一个放在烤箱里。 他站在烤箱旁边睡觉。

你忘了你的妻子对培根过敏。 您告诉员工A取消披萨。 他向厨师大喊大叫,把他叫醒。 厨师把披萨放在垃圾箱里,把一个犹太披萨放在烤箱里。 他很快就睡着了。

你等了,披萨准备好了,你得到账单。 它庞大(雇用太多员工,其中一半人在工作中睡觉)。

单线程异步/非阻塞

你去了下一家披萨店。

它有1名员工。

您走进商店,与员工交谈,查看菜单并订购披萨。

他走进去,把披萨放在烤箱里。 然后他将收据( 回调 )附在披萨上。 他走回柜台。

你还记得你的妻子这个月实际上不吃肉。 你告诉员工,他进去,解决了这个问题。

员工在里面检查完成的披萨后。 然后他读取收据(把这个披萨给鲍勃)。

你会得到价格便宜且反应灵敏的披萨

  1. 异步编程是能够执行与主程序流并行的一段代码。 这可以是Web服务调用或正在执行的当前应用程序中的任何任务。 回调命名或匿名方法,可以由委托表示。 回调可能会返回结果或exception。 由于异步方法的结果在任何时间点都会返回,如果查询异步方法的结果,则当前正在执行的线程将阻塞,直到该方法返回exception或结果。 .Net 3.0使用了BackgroundWorker,BeginInvoke / EndInvoke和IAsyncResult。(仍在使用).net 4.0有任务 .net 4.5有async等待完成此任务

  2. 异步调用使用multithreading实现。 基于实现,例如,如果使用Tasks来异步执行一些使用线程池线程的工作,那么框架将确定代码是在当前线程上执行还是需要新线程。

multithreading和异步编程之间的区别在于,在multithreading中,我们为函数创建一个新线程,以执行或仅完成此函数或任务

异步编程也使用multithreading,但是以异步的方式将工作或任务划分为多个线程

例如,如果我们使用multithreading并按如下方式分配线程,那么我们有4个任务

 Thread1 = task1 Thread2 = task2 Thread3 = task3 Thread4 = task4 

但是当我们使用异步编程模型时,我们不必分配线程

任务在线程之间自动划分,可以根据需要使用单线程或multithreading

如果它将使用单线程,那么任务1-4将同时工作

以循环方式

CPU在任务之间切换,启动任务运行几秒钟,然后保存其位置’上下文切换’然后启动其他任务。 这种情况发生得如此之快,似乎所有任务都在同一时间运行

同样,当我们在异步模型中有多个线程时

单个任务由多个线程处理,例如,如果task1由Thread1启动,则当thread1不在task1上时,它可以在thread2或thread3上运行

这是异步编程的美妙之处

我认为这对初学者来说是最好的解释

https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/#comment-21276