我不明白的是以下代码段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
,然后将其写入控制台。
答案 0 :(得分:2)
从调用者的角度来看,执行顺序完全相同
是和否。
如果await
所有任务一返回给你,然后是,那个孤立的方法就会看到相同的“执行顺序”。这实际上是async
/ await
的整个点 - 它允许以非常自然的方式编写大多数异步代码,类似于等效的同步代码。
但是,调用者必须知道它必须是异步的。也就是说,调用者通常使用await
,这意味着它必须是async
。异步代码有一些额外的曲折。一个例子:如果这是在UI线程上执行的,那么同步代码知道在SomeNormalFunctionThatReturnsAnInt
和Console.WriteLine
之间的UI线程上没有其他任何东西可以执行;但是,异步代码使用await
,因此必须接受其他任何内容都可以在SomeAsyncFunctionThatReturnsAnInt
和Console.WriteLine
之间的UI线程上执行。所以,从这种背景来看,它是不完全相同;在其他代码运行时,异步方法可能会暂停其“执行顺序”。
答案 1 :(得分:0)
如果您没有等待,则x的结果可能无法初始化。但是你在这里等待,所以没有区别。
答案 2 :(得分:0)
您需要对异步和同步进行一些阅读,以了解性能级别会发生什么,
在你的例子中,结果没有什么不同,因为你说等待等待的方法,但让我们看看下面的代码片段
$_FILES
你可以尝试计算输出,结果什么都没有,为什么?
等待我们让主要任务继续,因为我们在返回结果前等待5毫秒,看看