gpt4 book ai didi

c# async without await 收藏

转载 作者:太空狗 更新时间:2023-10-30 00:10:37 27 4
gpt4 key购买 nike

在此处的文档中:http://msdn.microsoft.com/en-us/library/hh191443.aspx它表明:

If an async method doesn’t use an await operator to mark a suspension point, the method executes as a synchronous method does, despite the async modifier. The compiler issues a warning for such methods.

我相信这是警告:

This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

然后,在不同的引用链接中,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 Async 方法,比如 HttpClient.GetStringAsync 并且我确实想实现一些具体的“长时间运行”同步逻辑,是有更合适的方法吗?

也许我的假设不正确,ComputeNextMove 可以声明为 private void ComputeNextMove(),这样不会产生任何警告。

最佳答案

是的,这只是一个不好的例子。

如果 ComputeNextMove 真正只是一个同步方法,它实际上并不异步执行任何操作(如描述所示),则不应将其声明为 异步。它应该是 private void ComputeNextMove()

由于使用了 Task.Run

ComputeNextMove 仍将在后台线程上执行。

我很可能在这里使用方法组转换而不是 lambda 表达式:

await Task.Run((Action) ComputeNextMove);

关于c# async without await 收藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21707714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com