代码之家  ›  专栏  ›  技术社区  ›  Benjol

包装用于异步UI使用的慢速同步I/O

  •  3
  • Benjol  · 技术社区  · 6 年前

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

    我正在试图找到一种方法来包装它,以便从UI中轻松使用,这样我的用户就可以连接起来,而不必冻结整个UI,最好是这样我就可以 async-await 是的。

    但我读到的是相互矛盾的建议,比如“只使用Task.Run进行CPU限制的操作”。

    异步等待 Task.Run (省略) ConfigurAwait(false) ),或实现一个整体 INotifyCompletion ?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Stephen Cleary    6 年前

    区分“理想”和“现实世界”很重要。理想的, async 应该是一路的。理想情况下,所有I/O都应该是异步的,并且不使用线程池线程,并且 Task.Run 仅用于CPU绑定的方法。理想的, async void

    在现实世界中,有时你不得不混合 以及由于缺少时间(或库支持)而导致的同步。在现实世界中,并不是所有的I/O操作都有异步API,甚至还有像 HttpClient 异步无效 有时是一种比裸延续更干净的方法,即使它不用于事件处理程序。

    任务。运行 不用担心。主要问题是 任务。运行 当您在ASP.NET应用程序或库中使用它时,它可能会干扰线程池的其他使用。因为您正在处理UI应用程序,所以使用