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


当前回答

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

举个例子:

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

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

其他回答

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

同步/异步与多线程无关。

同步或同步意味着“连接”,或在某种程度上“依赖”。换句话说,两个同步任务必须彼此知道,并且一个任务必须以依赖于另一个任务的某种方式执行,例如等待开始,直到另一个任务完成。 异步意味着它们是完全独立的,任何一方都不能以任何方式考虑另一方,无论是在初始化还是执行中。

同步(一个线程):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

同步(多线程):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

异步(一个线程):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

异步(多线程):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|

任务A, B, C的起始和结束点用<,>字符表示。 CPU时间片用竖条|表示

从技术上讲,同步/异步的概念实际上与线程没有任何关系。虽然,在一般情况下,在同一个线程上运行异步任务是不寻常的,但这是可能的(参见下面的例子),并且在不同的线程上同步执行两个或多个任务是很常见的……不,同步/异步的概念只与是否可以在另一个(第一个)任务完成之前启动第二个或后续任务有关,或者它是否必须等待。仅此而已。任务执行在哪个线程(或多个线程)、进程、cpu,甚至是什么硬件上都无关紧要。事实上,为了说明这一点,我编辑了图表来显示这一点。


异步的例子:

在解决许多工程问题时,软件被设计成将整个问题分解成多个单独的任务,然后异步地执行它们。求矩阵的逆,或者有限元素分析问题,都是很好的例子。在计算中,对列表排序就是一个例子。例如,快速排序例程将列表分成两个列表,并对每个列表执行快速排序,递归地调用自身(快速排序)。在上面的两个例子中,这两个任务都可以(而且经常是)异步执行。它们不需要在单独的线程上。即使是只有一个CPU和一个执行线程的机器,也可以在第一个任务完成之前开始第二个任务的处理。唯一的标准是,一个任务的结果不需要作为另一个任务的输入。只要任务的开始时间和结束时间重叠(只有在两个任务的输出都不需要作为另一个任务的输入时才有可能),它们就是异步执行的,不管使用了多少线程。

同步的例子:

由多个任务组成的任何进程,这些任务必须按顺序执行,但其中一个任务必须在另一台机器上执行(获取和/或更新数据,从金融服务获取股票报价,等等)。如果它在单独的机器上,那么它就在单独的线程上,无论是同步的还是异步的。

我认为这是一个有点迂回的解释,但它仍然澄清了使用现实生活中的例子。

小例子:

让我们假设播放音频包含三个步骤:

从硬盘中获取压缩的歌曲 解压音频。 播放未压缩的音频。

如果你的音频播放器为每首歌依次执行步骤1、2、3,那么它就是同步的。你必须等待一段时间才能听到这首歌,直到这首歌真正被提取和解压。

如果你的音频播放器独立执行第1、2、3步,那么它就是异步的。ie。 当播放音频1(步骤3)时,如果它并行地从硬盘中获取音频3(步骤1),并且并行地解压音频2。(第二步) 你最终会听到这首歌,而不需要等待太多的取回和解压。

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

a
b
c
fail

然后我们从头开始:

a
b
c
d

这是同步的

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

a
b
c
fail

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

c
d

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

我认为一个很好的方法是把它看作是一个经典的跑步接力赛

同步:流程就像同一个团队的成员一样,它们直到收到接力棒(前一个流程/运行者执行的结束)才会执行,但它们彼此都是同步的。

异步:在同一接力赛跑道上的不同团队的成员,他们将运行和停止,彼此异步,但在同一场比赛中(整体程序执行)。

这有意义吗?