包装慢速同步I/O以实现异步UI消耗

Ben*_*jol 3 c# wpf task mvvm async-await

我有一个外部库,它可以减慢I/O(串行+无线等),在API中没有异步(甚至是旧式).

我正在尝试找到一种方法来包装它以便从UI轻松消费,这样我的用户就可以在没有整个UI冻结的情况下进行连接,最好是我可以async-await这样做.

但我正在阅读相互矛盾的建议,例如"仅使用Task.Run进行CPU绑定操作".

所以我该怎么做?刚async-awaitTask.Run(省略ConfigurAwait(false)),或实现一个整体INotifyCompletion

Ste*_*ary 7

区分"理想"和"现实世界"非常重要.理想情况下,async应该一路走来.理想情况下,所有I/O都应该是异步的,不会耗尽线程池线程,并且Task.Run仅用于CPU绑定方法.理想情况下,async void应该只用于事件处理程序.

在现实世界中,有时async由于时间不足(或图书馆支持),您必须混合和同步.在现实世界中,并非所有I/O操作都具有异步API,甚至是闪亮的新类型,例如HttpClient使用线程池线程来解决没有人想花时间修复的旧DNS解析代码.在现实世界中,async void有时候比裸露的延续更简洁,即使它不用于事件处理程序.

在你的情况下,我会使用Task.Run而不用担心它.主要问题Task.Run是当您在ASP.NET应用程序或库中使用它时,它可能会干扰线程池的其他用法.由于您正在使用UI应用程序,因此使用Task.RunI/O并非"理想",但作为权衡,它是一个非常好的选择.

  • 谢谢。我将用评论“从斯蒂芬克利里赦免”来提交我的代码:) (2认同)