在此处的文档中: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()
。
由于使用 ComputeNextMove
, Task.Run
仍将在后台线程上执行。
我很可能在这里使用方法组转换而不是 lambda 表达式:
await Task.Run((Action) ComputeNextMove);