在文档浏览:http://msdn.microsoft.com/en-us/library/hh191443.aspx表明:C#异步无需等待
如果异步方法不使用的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()
{
// ...
}
// ...
}
这里,我将假定即ComputeNextMove
基本上是一个同步方法本身不打电话等待。这似乎与编译器警告的发布相矛盾(除非它是一个不好的例子......)
如果我没有在异步调用堆栈的END处调用.net异步方法,如HttpClient.GetStringAsync
和I是否想要实现一些具体的“长时间运行”的同步逻辑,是否有更合适的方法来做到这一点?
也许我的假设是不正确的,并且ComputeNextMove
可能被宣布为private void ComputeNextMove()
这将不会产生警告。
这是令人困惑的。你正在调用'Task.Run(Func)',它等待返回的任务。 –
SLaks
'任务'本身调用'await'。 – Jon
“如果代码具有不等待的异步,则它是同步的” - 显示两个代码:“我认为它是同步的。”我迷路了。 – Magus