Csharp/C#教程:c#async没有等待分享


c#async没有等待

在这里的文档: http : //msdn.microsoft.com/en-us/library/hh191443.aspx它表明:

如果异步方法不使用await运算符来标记挂起点,则该方法将作为同步方法执行,尽管存在异步修饰符。 编译器会为此类方法发出警告。

我相信这是警告:

这种异步方法缺少’await’运算符并将同步运行。 考虑使用’await’运算符等待非阻塞API调用,或’await Task.Run(…)’在后台线程上执行CPU绑定工作。

然后,在另一个引用的链接https://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx中 ,它显示的示例如下:

public class Example { // ... private async void NextMove_Click(object sender, RoutedEventArgs e) { await Task.Run(() => ComputeNextMove()); // Update the UI with results } private async Task ComputeNextMove() { // ... } // ... } 

在这里,我假设 ComputeNextMove本质上是一个同步方法,本身不会调用await。 这似乎与编译器警告的发布相矛盾(除非它是一个坏的例子……)

如果我没有在异步调用堆栈的END处调用.net异步方法,比如HttpClient.GetStringAsync并且我想实现一些具体的“长时间运行”同步逻辑,那么有更合适的方法吗?

也许我的假设不正确, ComputeNextMove可以声明为private void ComputeNextMove() ,它不会产生任何警告。

是的,这只是一个糟糕的例子。

如果ComputeNextMove 确实只是一个异步执行任何异步的同步方法(如描述所示),则不应将其声明为async 。 它应该是private void ComputeNextMove()

由于使用了Task.Run ComputeNextMove仍将在后台线程上执行。

我很可能在这里使用方法组转换而不是lambda表达式:

上述就是C#学习教程:c#async没有等待分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 await Task.Run((Action) ComputeNextMove); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/952441.html

(0)
上一篇 2021年11月19日
下一篇 2021年11月19日

精彩推荐