C# 我对async Wait的理解正确吗?
我至少读过十几篇关于它的文章,我想我终于明白了。批评我下面的解释C# 我对async Wait的理解正确吗?,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我至少读过十几篇关于它的文章,我想我终于明白了。批评我下面的解释 如果在函数中使用async关键字,它向函数的调用者发出信号,当它到达函数内部的wait关键字时,它可以在函数调用后继续执行任何独立工作,直到返回waited函数的结果,然后它可以从调用的地方返回finish停止。关键字async不会影响被调用方等待的任何内容。等待任何任务都是合法的,不管它来自哪里。让我们看看这个例子: async Task Main() { Console.WriteLine("Starting A no
如果在函数中使用
async
关键字,它向函数的调用者发出信号,当它到达函数内部的wait
关键字时,它可以在函数调用后继续执行任何独立工作,直到返回wait
ed函数的结果,然后它可以从调用的地方返回finish停止。关键字async
不会影响被调用方等待的任何内容。等待任何任务
都是合法的,不管它来自哪里。让我们看看这个例子:
async Task Main()
{
Console.WriteLine("Starting A now.");
GetResult();
Console.WriteLine("Finished A now.");
Console.WriteLine("Starting B now.");
await GetResult();
Console.WriteLine("Finished B now.");
Console.WriteLine("Starting C now.");
GetResultAync();
Console.WriteLine("Finished C now.");
Console.WriteLine("Starting D now.");
await GetResultAync();
Console.WriteLine("Finished D now.");
}
Task GetResult()
{
return Task.Delay(5000).ContinueWith(a => Console.WriteLine("Finished!"));
}
async Task GetResultAync()
{
await Task.Delay(5000).ContinueWith(a => Console.WriteLine("Finished!"));
}
如您所见-Main
能够等待结果,而不管该方法是否为async
。Async只是指示编译器:
async
,需要转换为状态机,并且时,返回a
(其中a
是int
),将结果包装到任务中
公共异步任务访问WebAsync(){…}
您可以按如下方式调用上述方法:
Task<int> accessWebTask = AccessTheWebAsync();
... --> code that does not depend on the result of the previous line
var result = await accessWebTask;
... --> code that should not execute until the operation above is done
or shorter form:
10 var result = await AccessTheWebAsync();
11 ... code after awaited operation
Task accessWebTask=AccessTheWebAsync();
... --> 不依赖于前一行结果的代码
var result=等待访问webtask;
... --> 在完成上述操作之前不应执行的代码
或简称:
10 var result=等待访问WebAsync();
11 ... 等待操作后的代码
“Wait”(等待)运算符表示暂停点,也就是说,等待操作后的代码要求等待操作(第10行)完成,然后才能执行其余代码(第11行等)。
“等待”可以用于返回无效的方法,在这种情况下,没有等待,这是一个火和忘记操作
编译器代表您生成代码,以便所有这些都可以工作
“async/await”的另一个好处是在代码可读性(线性流,异步代码读起来像同步的)和异常处理方面,大多数情况下
还要记住,“async/await”与多线程几乎没有关系。它旨在帮助实现非阻塞操作(db/文件系统/网络)和UI响应
如果您对更具概念性的观点感兴趣,请阅读本文:
()
这个问题的简单答案是“是”。这是一个常见的误解,但必须正确:你不等待方法,你只等待任务!在许多情况下,您等待的任务不是通过异步方法创建的。删除了有问题的句子,但为了清楚起见,“await”关键字只能在标记有“async”修饰符的方法中使用。
Task<int> accessWebTask = AccessTheWebAsync();
... --> code that does not depend on the result of the previous line
var result = await accessWebTask;
... --> code that should not execute until the operation above is done
or shorter form:
10 var result = await AccessTheWebAsync();
11 ... code after awaited operation