【发布时间】:2014-02-12 00:49:05
【问题描述】:
在此处的文档中: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()
{
// ...
}
// ...
}
在这里,我将假设ComputeNextMove 本身基本上是一个同步方法,而不是调用await。那么这似乎与编译器警告的发布相矛盾(除非它是一个坏例子......)
如果我没有在异步调用堆栈的 END 调用 .net Async 方法,例如 HttpClient.GetStringAsync 并且我确实想实现一些具体的“长时间运行”同步逻辑,是否有更合适的方法来做是吗?
也许我的假设不正确,ComputeNextMove 可以声明为 private void ComputeNextMove(),这样不会产生任何警告。
【问题讨论】:
-
这令人困惑。你正在调用
Task.Run(Func<Task>),它等待返回的任务。 -
Task本身调用await。 -
“如果代码具有异步且没有等待,则它是同步的” - 显示两者的代码:“我假设它是同步的。”我迷路了。
标签: c# .net asynchronous async-await