从调用者的角度来看,如何调用异步方法与调用同步方法有什么不同?

时间:2016-05-22 16:57:35

标签: c# .net multithreading asynchronous async-await

我不明白的是以下代码段from MSDN

  

请注意,该方法现在标有新的async关键字;这是   只是编译器的一个指示器,让它知道在   在此方法的上下文中,关键字await将被视为一个点   工作流将控制权返回给其调用者并再次获取   当相关任务完成时。

与非async方法的工作方式有何不同?

如果我这样做

int x; 
x = SomeNormalFunctionThatReturnsAnInt(); 
Console.WriteLine(x);

int x; 
Task<int> task = SomeAsyncFunctionThatReturnsAnInt();
x = await task; 
Console.WriteLine(x);

然后从调用者 的角度来看 ,执行顺序完全相同:定义了名为int的{​​{1}},运行返回x的函数,当该函数运行完毕后,其返回值设置为int,然后将其写入控制台。

3 个答案:

答案 0 :(得分:2)

  

从调用者的角度来看,执行顺序完全相同

是和否。

如果await所有任务一返回给你,然后,那个孤立的方法就会看到相同的“执行顺序”。这实际上是async / await的整个 - 它允许以非常自然的方式编写大多数异步代码,类似于等效的同步代码。

但是,调用者必须知道它必须是异步的。也就是说,调用者通常使用await,这意味着它必须是async。异步代码有一些额外的曲折。一个例子:如果这是在UI线程上执行的,那么同步代码知道在SomeNormalFunctionThatReturnsAnIntConsole.WriteLine之间的UI线程上没有其他任何东西可以执行;但是,异步代码使用await,因此必须接受其他任何内容都可以在SomeAsyncFunctionThatReturnsAnIntConsole.WriteLine之间的UI线程上执行。所以,从这种背景来看,它是不完全相同;在其他代码运行时,异步方法可能会暂停其“执行顺序”。

答案 1 :(得分:0)

如果您没有等待,则x的结果可能无法初始化。但是你在这里等待,所以没有区别。

答案 2 :(得分:0)

您需要对异步和同步进行一些阅读,以了解性能级别会发生什么,

在你的例子中,结果没有什么不同,因为你说等待等待的方法,但让我们看看下面的代码片段

$_FILES

你可以尝试计算输出,结果什么都没有,为什么?

等待我们让主要任务继续,因为我们在返回结果前等待5毫秒,看看

https://msdn.microsoft.com/en-gb/library/mt674882.aspx