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

C# c语言中多线程和异步程序的区别#,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我最初在Stackoverflow和google中搜索过类似的问题。只有一个链接给出了一些观点,但我不能清楚地理解。[] 以下问题困扰着我: 在异步编程中,什么是真正的回调方法?是 代表 异步程序的实现是使用多线程 如果能提供图片来解释,我将不胜感激 []1)回调基本上是传递给过程的委托,该过程将在某个适当的点“回调”。例如,在WebRequest.BeginGetResponse或WCF BeginXxx操作等异步调用中,您将传递一个异步回调。工作程序将“回调”您作为AsyncCallbac

我最初在Stackoverflow和google中搜索过类似的问题。只有一个链接给出了一些观点,但我不能清楚地理解。[]

以下问题困扰着我:

  • 在异步编程中,什么是真正的回调方法?是 代表

  • 异步程序的实现是使用多线程

  • 如果能提供图片来解释,我将不胜感激


    []

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

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

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

  • 异步编程是执行与主程序流并行的一段代码的能力。这可以是web服务调用,也可以是当前应用程序中正在执行的任何任务。回调是一个命名方法或匿名方法,可以由委托表示。回调可能返回结果或异常。由于异步方法的结果在任何时间点返回,因此如果查询异步方法的结果,当前执行线程将阻塞,直到方法返回异常或结果。 .Net 3.0使用了BackgroundWorker、BeginInvoke/EndInvoke和IAsyncResult。(仍在使用) .NET4.0已经发布 .NET4.5必须做到这一点

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


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

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

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

    Thread1 = task1
    Thread2 = task2
    Thread3 = task3
    Thread4 = task4
    
    但是当我们使用异步编程模型时 我们不必分配线程

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

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

    以循环方式

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

    类似地,当异步模型中有多个线程时

    单个任务由多个线程处理 e、 g如果task1由Thread1启动,则当Thread1不在task1上工作时,它可能在thread2或thread3上运行

    这就是异步编程的美妙之处

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

    单螺纹阻塞 为了理解异步/并发/多线程,我们需要从最基本的知识开始,以及为什么我们要给这个问题增加如此多的复杂性

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

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

    假设你的电脑是一个只有一名员工的比萨饼店。他只受过基本训练

    你走进商店,与员工交谈,看菜单,点比萨饼

    太好了。员工走进商店的后面,把一个比萨饼放在烤箱里,站在烤箱旁边等待比萨饼烹饪

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

    你生气了就走

    多线程并发阻塞 你去下一家比萨饼店

    它有4名员工

    你走进商店,与员工交谈,看菜单,点比萨饼

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

    你忘了你妻子对熏肉过敏。你告诉员工A取消比萨饼。他在屋里对厨师大叫,把他叫醒。厨师把比萨饼扔进垃圾箱,然后把一个犹太比萨饼放进烤箱。他很快又睡着了

    等一下,比萨饼准备好了,你会收到账单的。其规模巨大(雇佣了太多员工,其中一半人在工作中睡觉)

    单线程异步/非阻塞 你去下一家比萨饼店

    它有一名员工

    你走进商店,与员工交谈,看菜单,点比萨饼

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

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

    在员工检查内部是否有一个做过的比萨饼后。然后他看了收据(把这个比萨饼给鲍勃)


    您可以买到便宜、价格合理、响应速度快的比萨饼。

    异步并不总是意味着多线程。-布朗大学。不同之处在于并发性在codeproject上有一篇好文章,请