异步执行和同步执行之间的区别是什么?


当前回答

同步是指调用方等待响应或完成,异步是指调用方继续执行并且稍后出现响应(如果适用的话)。

举个例子:

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

因为进行异步调用的方法将立即继续执行下一行代码。我之所以说“可能”,是因为异步操作无法保证执行顺序。它也可以作为原始文件执行,这取决于线程计时等。

其他回答

当您同步执行某项任务时,您需要等待该任务完成后才能继续执行另一项任务。当您异步执行某个任务时,您可以在它完成之前转移到另一个任务。

在操作系统上下文中,这对应于在“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统在处理器核心上运行给定的线程。然而,处理器内核一次只能执行一个线程。它没有同时运行多个线程的概念。操作系统可以通过运行每个线程一小段时间(比如1ms),并在线程之间不断切换,来提供同时运行多个线程的假象。

现在,如果您在混合中引入多个处理器核心,那么线程可以同时执行。操作系统可以将时间分配给第一个处理器核心上的一个线程,然后将相同的时间块分配给不同处理器核心上的另一个线程。所有这些都是关于允许操作系统管理任务的完成,而您可以继续在代码中执行其他事情。

异步编程是一个复杂的主题,因为当您可以同时进行这些事情时,它们是如何结合在一起的语义。关于这个主题的文章和书籍数不胜数;看看吧!

当执行a>b>c>d>这样的序列时,如果我们在执行过程中遇到如下失败:

a
b
c
fail

然后我们从头开始:

a
b
c
d

这是同步的

然而,如果我们有相同的序列要执行:a>b>c>d>,我们在中间有一个失败:

a
b
c
fail

...但我们不是从头开始,而是从失败的地方重新开始:

c
d

...这就是所谓的异步。

同步操作在返回调用方之前完成其工作。

异步操作在返回调用方之后完成(大部分或全部)工作。

你混淆了同步与并联与串联。同步的意思是同时发生所有的事情。同步的意思是彼此相关,可以是串联的,也可以是固定间隔的。当程序在做所有的事情时,它是串联运行的。找本字典……这就是为什么我们有不甜的茶。你有茶或甜茶。

举个简单的例子,

同步

想象一下,三个学生被要求在公路上进行接力赛。

第一个学生跑完指定的距离,停下来把接力棒传给第二个。没有人开始跑步。

1------>
        2.
                3.

当第二个学生拿起接力棒时,她开始跑指定的距离。

      1.
        2------>
                3.

第二个学生解开了鞋带。现在她又停了下来,重新系上了领带。因此,2号的结束时间延长了,3号的开始时间推迟了。

      1.
        --2.--->
                3.

这种模式一直持续到第三名从第二名手中接过接力棒并完成比赛。

异步

想象一下,10个人随机走在同一条路上。 他们当然不是在排队,只是随机地在路上不同的地方以不同的速度行走。

第二个人的鞋带被解开了。她停下来又把它扎了起来。

但没人等着她把头发扎起来。其他人都还在以同样的速度走着他们以前的路。

10-->    9-->
   8--> 7-->   6-->
 5-->     4-->
1-->   2.    3-->