c#async没有等待

时间:2014-02-11 16:39:53

标签: c# .net asynchronous async-await

在此处的文档中:http://msdn.microsoft.com/en-us/library/hh191443.aspx表示:

  

如果异步方法不使用await运算符来标记暂停   一点,该方法作为同步方法执行,尽管如此   异步修饰符。编译器会发出此类方法的警告。

我相信这是警告:

  

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

然后,在另一个引用的链接http://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基本上是一种同步方法,本身并不是在等待。这似乎与发出编译器警告相矛盾(除非这是一个不好的例子......)

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

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

1 个答案:

答案 0 :(得分:12)

是的,这只是一个不好的例子。

如果ComputeNextMove 真正只是一个异步执行异步的同步方法(如说明所示),则不应将其声明为async。它应该是private void ComputeNextMove()

由于使用ComputeNextMove

Task.Run仍将在后台线程上执行。

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

await Task.Run((Action) ComputeNextMove);