在这里的文档中:http://msdn.microsoft.com/en-us/library/hh191443.aspx,它指出:
这里,我假设
如果我在我的异步调用堆栈的结尾没有调用.net异步方法,比如
也许我的假设是不正确的,
我认为这是警告内容:如果异步方法没有使用await运算符来标记暂停点,该方法将像同步方法一样执行,尽管有异步修饰符。编译器会为这些方法发出警告。
然后,在另一个引用链接中,http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx,它展示的示例如下:此异步方法缺少'await'运算符并将以同步方式运行。请考虑使用'await'运算符等待非阻塞API调用,或使用'await Task.Run(...)'在后台线程上进行CPU绑定工作。
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()
,这将不会产生警告。
Task.Run(Func<Task>)
,它会等待返回的任务。 - SLaksTask
本身调用await
。 - Jon