当你使用async-await时,我在哪里定义Task以及我等待它的位置是否重要?

use*_*000 3 .net c# asynchronous async-await

我正在看示例方法

public async Task MyMethodAsync()
{
    Task<int> longRunningTask = LongRunningOperationAsync();
    // independent work which doesn't need the result of LongRunningOperationAsync can be done here

    //and now we call await on the task 
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)

How和何时使用`async`和`await`,我有一个关于它是如何工作的问题.

所以,我想说我可以添加一些"独立工作".

public async Task MyMethodAsync()
{
    Task<int> longRunningTask = LongRunningOperationAsync();
    int millionthPrimeNumber = GetMillionthPrimeNumber();
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result % millionthPrimeNumber);
}
Run Code Online (Sandbox Code Playgroud)

获得百万分之一的素数是独立的工作,所以我希望它是夹在Task<int> longRunningTask = LongRunningOperationAsync();和之间的东西int result = await longRunningTask;

但是,我很好奇的是我是否可以写作

public async Task MyMethodAsync()
{
    int result = await LongRunningOperationAsync();
    int millionthPrimeNumber = GetMillionthPrimeNumber();       
    //use the result 
    Console.WriteLine(result % millionthPrimeNumber);
}
Run Code Online (Sandbox Code Playgroud)

这是否相同?抑或是Task<int> longRunningTask = LongRunningOperationAsync();int result = await longRunningTask;实际作为标志,这样可以做独立的工作是什么,它们之间?

Eri*_*ert 8

很多人误解了这一点.

首先:await不会启动任务.调用任务返回方法启动任务.Await不会导致同步的方法神奇地变为异步.

然后做什么呢?Await意味着在此任务完成后的某个时间之后,此点之后的内容将不会运行.而已.这就是它的含义.为此,它异步等待任务完成.通过"异步等待",我的意思是"返回呼叫者,以便在我们等待时可以完成更多工作".

如果任务产生一个值,那么await将从已完成的任务中提取值.这是完全一致的:如果下面的代码取决于任务的值,那么它还取决于正在完成的任务!

您应该在代码等待以下代码取决于已完成的等待任务的点.

这是否相同?

它们是等价的,因为它们最终都会产生相同的结果.它们表达不同的异步工作流程并不等同.