首页 文章

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

提问于
浏览
15

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

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

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

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

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

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

1 回答

  • 20

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

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

相关问题