c#async没有等待

Nov*_*vox 4 .net c# asynchronous async-await

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

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

我相信这是警告:

这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await 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()
    {
        // ...
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,我假设ComputeNextMove本质上是一个同步方法,本身并不是在等待.这似乎与发出编译器警告相矛盾(除非这是一个不好的例子......)

如果我没有在异步调用堆栈的END处调用.net异步方法,就像HttpClient.GetStringAsync我想要实现一些具体的"长时间运行"同步逻辑一样,有没有更合适的方法呢?

也许我的假设是不正确的,ComputeNextMove可以宣布为private void ComputeNextMove()不会产生任何警告.

Jon*_*eet 12

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

如果ComputeNextMove真正的只是它并没有真正做任何事情异步(作为描述建议)同步方法,它不应该被声明为async.它应该是private void ComputeNextMove().

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

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

await Task.Run((Action) ComputeNextMove);
Run Code Online (Sandbox Code Playgroud)

  • @BilalFazlani:不,这有点简单. (2认同)