【问题标题】:Difference between Multithreading and Async program in c#c#中多线程和异步程序的区别
【发布时间】:2015-04-17 10:13:37
【问题描述】:

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

以下问题困扰着我:

  1. 在异步编程中,什么是真正的回调方法?是 委托?

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

如能提供图解说明,不胜感激


[1] "Difference between Multithreading and Asynchronous programming"

【问题讨论】:

标签: c# multithreading asynchronous


【解决方案1】:

单线程阻塞

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

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

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

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

您走进商店,与员工交谈,查看菜单并点一份披萨。

太好了。员工走进商店的后部,将披萨放在上面然后站在烤箱旁边等待披萨煮熟

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

你生气了就走了。

多线程并发阻塞

你去下一家披萨店。

它有 4 名员工。

您走进商店,与员工交谈,查看菜单并点一份披萨。

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

您忘记了您的妻子对培根过敏。你告诉员工 A 取消披萨。他在里面对厨师大喊大叫,把他叫醒。厨师把披萨扔进垃圾桶,然后把犹太披萨放进烤箱。他很快又睡着了。

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

单线程异步/非阻塞

你去下一家披萨店。

它有 1 名员工。

您走进商店,与员工交谈,查看菜单并点一份披萨。

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

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

在员工检查内部是否有烤好的披萨之后。然后他阅读收据(把这个披萨给鲍勃)。

您可以买到便宜实惠且反应灵敏的披萨。

【讨论】:

    【解决方案2】:

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

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

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

    Async Programming and Multi Threading

    Difference between Multithreading & Async Prograaming

    【讨论】:

    • 这有多真实?阅读问题评论中提供的文档,似乎异步不依赖于多线程......
    【解决方案3】:

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

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

    例如,如果我们有 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

    【讨论】:

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

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

      【讨论】:

      • 值得注意的是,上述类比也适用于汉堡包餐厅、寿司餐厅以及(可能有一些限制)纯素食餐厅。
      猜你喜欢
      • 2016-04-13
      • 2018-12-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2015-05-08
      • 2012-12-18
      相关资源
      最近更新 更多