我最初在Stackoverflow中搜索并搜索类似类型的问题。只有一个链接给了一些点,但我无法理解清楚。 [1]
以下问题困扰着我:
在异步编程中,什么是真正的Callback方法?是 委派?
异步程序的实现者正在使用多线程?
如果提供图形解释,我将非常感激
[1] "Difference between Multithreading and Asynchronous programming"
答案 0 :(得分:3)
1)回调基本上是一个传递给程序的委托,该程序将回调"在某个适当的时候。例如,在诸如WebRequest.BeginGetResponse或WCF BeginXxx操作的异步调用中,您将传递AsyncCallback。工人将回电"你传递的任何方法都是AsyncCallback,在这种情况下,它完成后会告诉你它已经完成并获得结果。
2)多线程是程序运行的不同部分,通常称为线程。
异步编程使用线程来启动一段代码。所以异步编程依赖多线程来工作。请参阅以下链接:
答案 1 :(得分:3)
要了解异步/并发/多线程,我们需要从最基本的开始,为什么我们为这个问题添加了如此多的复杂性。
最初只有单线程阻塞应用程序。这些都是非常简单的程序,而且很可能,这些正是你现在所写的。
为了解释,我将使用比萨饼屋的类比。
想象一下,您的计算机是一个只有一名员工的披萨店。他只接受过基础训练。
您走进商店,与员工交谈,查看菜单并订购披萨。
大。员工走进商店后面,在 上面放一个比萨饼,然后站在烤箱旁边等待披萨做饭 。
你记得你的妻子不喜欢菠萝。你对那个试图引起他注意改变你的订单的员工大喊大叫。没有骰子。他不会离开烤箱(他睡着了)。
你生气了,离开了。
你去了下一家披萨店。
它有4名员工。
您走进商店,与员工交谈,查看菜单并订购披萨。
他向后面的其他员工大喊(发送消息),让你成为披萨。他们把一个放在烤箱里。他站在烤箱旁边睡觉。
你忘了你的妻子对培根过敏。你告诉员工A取消披萨。他向厨师大喊大叫,把他叫醒。厨师把披萨放在垃圾箱里,把一个犹太披萨放在烤箱里。他很快就睡着了。
你等了,披萨准备好了,你得到账单。它的规模庞大(招聘太多员工,其中一半人在工作中睡觉)。
你去了下一家披萨店。
它有1名员工。
您走进商店,与员工交谈,查看菜单并订购披萨。
他走进去,把披萨放在烤箱里。然后,他将收据( 回调 )附加到披萨上。他走回柜台。
你还记得你的妻子这个月实际上并没有吃肉。你告诉员工,他进去,解决了这个问题。
员工在里面检查完成的披萨后。然后他读取收据(把这个披萨给鲍勃)。
你得到便宜又实惠且反应灵敏的比萨饼。
答案 2 :(得分:0)
异步编程是能够执行与主程序流并行的一段代码。这可以是Web服务调用或正在执行的当前应用程序中的任何任务。 回调是命名或匿名方法,可以由委托表示。回调可能会返回结果或异常。由于异步方法的结果在任何时间点都会返回,因此如果查询异步方法的结果,则当前正在执行的线程将阻塞,直到该方法返回异常或结果。 .Net 3.0使用了BackgroundWorker,BeginInvoke / EndInvoke和IAsyncResult。(仍在使用中) .net 4.0有Tasks .net 4.5有async await来完成这个
使用多线程实现异步调用。基于实现,例如,如果使用Tasks来异步执行一些使用线程池线程的工作,那么框架将确定代码是在当前线程上执行还是需要新线程。
答案 3 :(得分:0)
多线程和异步编程之间的区别在于,在多线程中,我们为函数创建一个新线程来执行或仅完成此函数或任务
异步编程也使用多线程,但方式不同 在异步中,工作或任务分为多个线程
例如,如果我们有4个任务 如果我们使用多线程并按如下方式分配线程
Thread1 = task1
Thread2 = task2
Thread3 = task3
Thread4 = task4
但是当我们使用异步编程模型时 我们不必分配线程
任务在线程之间自动划分 可能是它需要使用单线程或多线程
如果它将使用单线程,那么任务1-4将同时工作
循环时尚 在任务之间切换CPU,启动任务运行它几秒钟,然后保存其位置'上下文切换'然后启动其他任务。 这种情况发生得如此之快,似乎是所有任务同时运行的错觉同样,当我们在异步模型中有多个线程时
单个任务由多个线程处理 例如,如果task1由Thread1启动,则当thread1不在task1上工作时,它可以在thread2或thread3上运行
这是异步编程之美
我认为这对初学者来说是最好的解释