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



我相信这是警告:



然后,在另一个引用链接 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 本身基本上是一个同步方法,而不是调用 await。那么这似乎与发布编译器警告相矛盾(除非这是一个坏例子......)

如果我没有在异步调用堆栈的末尾调用 .net 异步方法,例如 HttpClient.GetStringAsync 并且我确实想实现一些具体的“长时间运行”同步逻辑,有没有更合适的方法来做到这一点?

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

最佳答案

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

如果 ComputeNextMove 真的只是一个同步方法,它并没有真正异步地做任何事情(如描述所暗示的那样),则不应将其声明为 async 。它应该是 private void ComputeNextMove()

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

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

await Task.Run((Action) ComputeNextMove);

10-06 13:49