C# 异步的影响

Ale*_*lex -1 c# asynchronous

我正在学习 C# 异步,并试图准确了解使方法异步的影响是什么。

如果我有以下方法(非异步):

public bool method()
{
     int a = 2 + 1;      //line 1
     string b = "test";  //line 2
     double c = 2.14;    //line 3
     return true;        //line 4
}
Run Code Online (Sandbox Code Playgroud)

上面的方法中,编译器会依次执行每一行,比如先执行第1行,再执行第2行等

我的问题涉及添加异步对执行顺序的影响,如下所示。

public async Task<bool> method()
{
     int a = 2 + 1;      //line 1
     string b = "test";  //line 2
     double c = 2.14;    //line 3
     return true;        //line 4
}
Run Code Online (Sandbox Code Playgroud)

添加 async 是否会导致编译器现在同时执行第 1、2、3 和 4 行?

如果是这样,如果我执行以下操作:

public async Task<bool> method()
{
     int a = await addNumbers(2, 1);      //line 1
     string b = "test";                   //line 2
     double c = 2.14;                     //line 3
     return true;                         //line 4
}

public async Task<int> addNumbers(int a, int b)
{         
     return a + b;
}
Run Code Online (Sandbox Code Playgroud)

然后在我看来,编译器将执行第 1 行,一旦它完成了第 1 行,它就会同时完成第 2、3 和 4 行。这样对吗?

最后,如果上述情况也是正确的,在这种情况下

public async Task<bool> method()
{
     int a = 2 + 1;                       //line 1
     string b = "test";                   //line 2
     double c = await getDouble();        //line 3
     double d = await getDouble();        //line 4
     int e = 2 + 1;                       //line 5
     int f = 2 + 1;                       //line 6
     return true;                         //line 7
}

public async Task<double> getDouble()
{         
     return 2.14;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,编译器将同时执行第 1 行和第 2 行,然后一旦完成它将执行第 3 行,然后一旦完成它将执行第 4 行,然后一旦第 4 行完成它将执行第 5 行和第 6 行同时?

我一直找不到任何可以为我清楚地详细说明这一点的内容,因此如果有人有任何好文章可以清楚地解释这一点,我们将不胜感激。

Han*_*ing 5

async不会“并行化”该方法。该方法仍然使用常规流程。

而是async启用await关键字。使用await可以推迟方法的执行,直到等待的方法完成。优点是在此期间其他代码可以运行 - await 不会阻塞线程。

编辑
您将await主要用于 IO 绑定调用,例如数据库或网络服务(以及调用异步方法的任何方法)。当“那个其他系统”正在处理您的请求时,您自己的应用程序不需要阻塞,但可以在您“等待”结果的同时处理其他代码。当其他系统返回结果时,您的方法会继续处理。