[英]c# async without await
在这里的文档: 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异步方法,比如HttpClient.GetStringAsync
并且我想实现一些具体的“长时间运行”同步逻辑,那么有更合适的方法吗?
也许我的假设是不正确的, ComputeNextMove
可以声明为private void ComputeNextMove()
,它不会产生任何警告。
是的,这只是一个糟糕的例子。
如果ComputeNextMove
真的只是一个异步执行任何异步的同步方法(如描述所示),则不应将其声明为async
。 它应该是private void ComputeNextMove()
。
由于使用了Task.Run
ComputeNextMove
仍将在后台线程上执行。
我很可能在这里使用方法组转换而不是lambda表达式:
await Task.Run((Action) ComputeNextMove);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.