c#中多线程和异步程序的区别

时间:2015-04-17 10:13:38

标签: c# multithreading asynchronous

我最初在Stackoverflow中搜索并搜索类似类型的问题。只有一个链接给了一些点,但我无法理解清楚。 [1]

以下问题困扰着我:

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

  2. 异步程序的实现者正在使用多线程?

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


    [1] "Difference between Multithreading and Asynchronous programming"

4 个答案:

答案 0 :(得分:3)

1)回调基本上是一个传递给程序的委托,该程序将回调"在某个适当的时候。例如,在诸如WebRequest.BeginGetResponse或WCF BeginXxx操作的异步调用中,您将传递AsyncCallback。工人将回电"你传递的任何方法都是AsyncCallback,在这种情况下,它完成后会告诉你它已经完成并获得结果。

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

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

Async Programming and Multi Threading

Difference between Multithreading & Async Prograaming

答案 1 :(得分:3)

单线程阻塞

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

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

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

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

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

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

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

你生气了,离开了。

多线程并发阻塞

你去了下一家披萨店。

它有4名员工。

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

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

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

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

单线程异步/非阻塞

你去了下一家披萨店。

它有1名员工。

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

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

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

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

你得到便宜又实惠且反应灵敏的比萨饼。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

异步编程也使用多线程,但方式不同 在异步中,工作或任务分为多个线程

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

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

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

任务在线程之间自动划分 可能是它需要使用单线程或多线程

如果它将使用单线程,那么任务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