异步执行和同步执行之间的区别是什么?
当前回答
关于同步执行的“同时”定义(有时会令人困惑),下面是一种理解它的好方法:
同步执行:一个代码块中的所有任务都在同一时间执行。
异步执行:一个代码块中的所有任务都不会同时执行。
其他回答
同步是指调用方等待响应或完成,异步是指调用方继续执行并且稍后出现响应(如果适用的话)。
举个例子:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
这将总是输出:
Before call
In call
After call
但如果我们要使doSomething()异步(有多种方式来做它),那么输出可以变成:
Before call
After call
In call
因为进行异步调用的方法将立即继续执行下一行代码。我之所以说“可能”,是因为异步操作无法保证执行顺序。它也可以作为原始文件执行,这取决于线程计时等。
以下是制作早餐的说明:
倒一杯咖啡。 烧热平底锅,然后煎两个鸡蛋。 煎三片培根。 烤两片面包。 在吐司上加黄油和果酱。 倒一杯橙汁。 如果你有烹饪经验,你会异步执行这些指令。你会先热锅煎鸡蛋,然后开始煎培根。你把面包放进烤面包机,然后开始煎鸡蛋。在这个过程的每一步,你都要开始一项任务,然后把注意力转移到那些已经准备好的任务上。 做早餐就是一个非并行的异步工作的好例子。一个人(或线程)可以处理所有这些任务。继续早餐的类比,一个人可以异步地做早餐,在第一个任务完成之前开始下一个任务。不管有没有人在看,烹饪都在进行。一旦你开始加热煎蛋的锅,你就可以开始煎培根了。培根烤好后,你可以把面包放进烤面包机。 对于并行算法,您需要多个cook(或线程)。一个做鸡蛋,一个做培根,等等。每个人都只专注于一项任务。每次烹饪(或线程)都将同步阻塞,等待培根准备翻转,或吐司爆裂。
(强调我的)
异步编程概念
是的,同步的意思是同时,从字面上看,它的意思是一起做功。世界上的多个人/物体可以同时做多件事,但如果我们看看计算机,它说同步意味着进程一起工作,意味着进程依赖于另一个的返回,这就是为什么它们以适当的顺序一个接一个地执行。异步意味着进程不能一起工作,它们可以同时工作(如果在多线程上),但是独立工作。
同步是指以队列方式逐一执行任务。假设只有一辆车需要在朋友之间共享才能到达目的地,一辆车将被共享。 在异步情况下,每个朋友都可以租到车并到达目的地。
同步执行意味着在单个系列中执行。A - C > B - > - > D。如果您正在调用这些例程,则A将运行,然后结束,然后B将开始,然后结束,然后C将开始,等等。
使用异步执行,你开始一个例程,并让它在后台运行,同时你开始下一个例程,然后在某个时候,说“等待这个完成”。更像是:
开始A->B->C->D->等待A完成
这样做的好处是,当A仍在运行时(在后台,在一个单独的线程上),您可以执行B、C和或D,因此您可以更好地利用资源,减少“挂起”或“等待”。
推荐文章
- 平行的。ForEach vs Task。运行和任务。WhenAll
- 很好的介绍了。net响应式框架
- 一个干净、轻量级的Python扭曲的替代品?
- 如何在package.json中使用“main”参数?
- 什么时候我应该在ASP中使用异步控制器。净MVC吗?
- 理解设置
- 如何使HTTP请求在PHP和不等待响应
- 反应-显示加载屏幕,而DOM是渲染?
- 如何正确地读取异步/等待文件?
- 使用Moq模拟单元测试的异步方法
- 如何使用JUnit来测试异步进程
- Kotlin协程中的启动/连接和异步/等待之间有什么区别
- 如何告诉PowerShell等待每个命令结束后才开始下一个?
- CompletableFuture, Future和RxJava的Observable之间的区别
- 为什么要在c#中使用Task<T>而不是ValueTask<T> ?