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


当前回答

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

举个例子:

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

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

其他回答

类比简单解释

(故事和图片帮助你记住)。

同步执行

我老板是个大忙人。他让我写代码。我告诉他:好吧。我一开始,他就像秃鹰一样盯着我,站在我身后,躲在我肩上。我说:“伙计,你干嘛不去做点什么,我把这个做完?”

他会说:“不,我就在这儿等你做完。”这是同步的。

异步执行

老板让我去做这件事,而不是在那里等我的工作,老板离开去做其他的事情。当我完成我的工作时,我简单地向我的老板报告并说:“我完成了!”这就是异步执行。

(听我的建议:永远不要在老板背后工作。)

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

我创建了一个动图来解释这一点,希望能有所帮助: 看,第3行是异步的,其他是同步的。 在行3之前的所有行都应该等到行完成它的工作,但因为行3是异步的,下一行(行4),不要等待行3,但行5应该等待行4完成它的工作,行6应该等待行5和7的6,因为行4,5,6,7不是异步的。

简而言之,同步指的是两个或多个进程的起点和终点,而不是它们的执行。在本例中,进程A的端点与进程B的起点同步:

SYNCHRONOUS
   |--------A--------|
                     |--------B--------|

另一方面,异步进程的起点和终点不同步:

ASYNCHRONOUS
   |--------A--------|
         |--------B--------|

在进程A与进程B重叠的地方,它们是并发或同步运行的(字典定义),因此造成了混淆。

更新:Charles Bretana改进了他的答案,所以这个答案现在只是一个简单的(可能过于简化了)助记符。

关于同步执行的“同时”定义(有时会令人困惑),下面是一种理解它的好方法:

同步执行:一个代码块中的所有任务都在同一时间执行。

异步执行:一个代码块中的所有任务都不会同时执行。