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

本文关键字:GetResult 回调 等待 GetAwaiter 异步 | 更新日期: 2023-09-27 18:28:46

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

我们异步调用该服务,以免阻塞UI。我们面前有两个选项:

  1. 使用异步等待关键字这需要将所有方法标记为Async,从按钮单击一直到服务层(客户端上对服务器进行http调用的类),以及介于两者之间的任何方法。这种方法除了在各处传播异步的问题之外,效果很好

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

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

我只是想找出哪种方法更好,如果其中一种方法有一些问题,我应该注意

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

您应该一直使用asyncawait关键字,或者根本不应该使用async。

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