异步等待与GetAwaiter().GetResult()和回调

vik*_*tal 19 .net c# async-await

我正在努力为我的一个项目寻找最佳实践.它是一个典型的WPF应用程序,其UI显示项目列表,并且有一个返回结果的数据服务.

我们异步调用服务,以便不阻止UI.我们面前有两种选择:

  1. 使用Async await关键字这需要标记所有方法Async from button按钮一直点击服务层(客户端上的类,使http调用服务器)和其间的任何方法.除了在任何地方传播异步的问题之外,这种方法工作正常

  2. 使用awaiter和callback在这种方法中,UI客户端调用服务层并将回调传递给服务层,服务层将http调用包装到任务中的服务器,并在http调用时使用GetAwaiter().GetResult()完成它会调用UI客户端传递的回调.在这种情况下,没有方法必须标记为异步,但不确定使用GetAwaiter()

    Task.Run(async()=> //等待http调用,调用回调).GetAwaiter().GetResult();

我只是想找出哪种方法更好,如果有任何方法存在问题,我应该注意

i3a*_*non 24

您应该一直使用asyncawait关键字,或者根本不应该使用异步.

你的第二个选择并非真正异步.它正在调用异步操作并同步阻塞它task.GetAwaiter().GetResult().除了非常复杂之外,它不是异步的,可能会导致死锁.

  • @FrederikGheysels http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html (5认同)
  • 是的,那么如何在没有异步的情况下调用像 FileIO.ReadBufferAsync 这样的函数呢? (3认同)
  • 在`async`关键字开始起作用之前,存在异步编程。您将使用Task.ContinueWith并提供回调,就像在Javascript中无处不在一样。这是完全一样的。`async`和`await`使得编写代码变得更加容易。 (3认同)
  • 你有更多关于为什么它可能导致死锁的背景信息吗?我也经历过这种情况,但我正在寻找一些关于为什么会发生这种情况或如何工作的更深入的信息。 (2认同)
  • @TheWebGuy 不确定你在问什么。但是如果任务出错,`await` 和 `GetAwaiter().GetResult()` 都会重新抛出异常。 (2认同)