我正在努力为我的一个项目寻找最佳实践。它是一个典型的WPF应用程序,其UI显示项目列表,并且有一个返回结果的数据服务。
我们异步调用服务,以便不阻止UI。我们面前有两个选择:
使用Async await关键字 这需要标记所有方法Async从按钮单击一直到服务层(客户端上的类,使http调用到服务器)和其间的任何方法。除了传播异步无处不在的问题之外,这种方法还可以正常工作
使用awaiter和回调 在这种方法中,UI客户端调用服务层并将回调传递给服务层,服务层将http调用包装到任务中的服务器并使用GetAwaiter()。GetResult(),当http调用完成时调用它UI客户端传递的回调。在这种情况下,没有方法必须标记为异步,但不确定使用GetAwaiter()
Task.Run(async()=> //等待http调用,调用回调).GetAwaiter()。GetResult();
我只是想找出哪种方法更好,如果我应该注意哪种方法存在问题
答案 0 :(得分:22)
您应该一直使用async
和await
个关键字,否则您根本不应该使用异步。
您的第二个选项并非真正异步。它正在调用异步操作并与task.GetAwaiter().GetResult()
同步阻塞它。
除了非常复杂之外,它不是异步的,可能会导致死锁。