我有一个WPF客户端,它使用提供异步API支持的外部库,但 在使用所述异步方法时执行某些CPU绑定工作 (例如实体实现,解析等)。使用异步方法是否有任何好处,我希望CPU绑定工作在另一个线程上?不使用Task.Run()
调用这些方法会导致一些动画抖动,因为CPU绑定工作仍在消息循环中的调度程序上发生,但如果API提供异步支持,我更喜欢使用它而不是同步代码。
我认为使用异步API 有好处,如果它可以重用Task.Run()
提供的线程池线程。我认为这是ASP.NET中async / await的主要好处之一,所以我假设重用线程池线程也是客户端的一个好处。
更新
更新了问题,陈述了 CPU 绑定的工作,正如Stephen指出的那样。我可以看到我的服务使用外部库的异步API的另一个好处,即使我将它包装在我的ViewModel中的Task.Run()中。也就是说,我的服务的任何其他调用者都将免费获得异步,而无需在此时更改实现或单独提供服务。
答案 0 :(得分:2)
我认为你的意思是CPU限制,而不是I / O限制。
Task.Run
使用线程池线程,可以重用。这与async
或ASP.NET无关。
在您的使用案例中,您对保持UI响应感兴趣,但是有一个混合I / O和CPU方法的API。在这种情况下,使用Task.Run
调用这些API方法非常合适。