【问题标题】:How do I write an async wrapper around a third party IO library in C#如何在 C# 中围绕第三方 IO 库编写异步包装器
【发布时间】:2015-01-08 15:05:07
【问题描述】:

我需要使用一个可以访问其自己的数据库的库。不幸的是,所有方法都是经典的同步方法。我更喜欢使用 async 方法来卸载 IO 负载,就像我们已经拥有的 SQL Server 一样。

我知道这是一个非常笼统的问题,没有太多具体信息。有什么方法可以达到这一点还是太糟糕了?

示例和/或链接将不胜感激。

【问题讨论】:

  • 除非您可以访问源代码,否则您无法自己包装它并使其真正异步。除非它已经为您公开了一些异步 API,否则这将是一个问题。
  • 你需要在这个第 3 方库中进行某种形式的异步调用。类似于 BeginRead() / EndRead()。有了这样的对,就可以编写一个异步/等待的包装器。

标签: c# .net io async-await


【解决方案1】:

如果您正在使用的库中有某种形式的异步 API,您可以使用它来制造带有 TaskCompletionSource<T>async API。它可以是 BeginX/EndXDoXXCompleted 事件或任何其他形式。

如果不存在类似的东西,您根本就无法创建真正的异步重载。您可以使用Task.Run 将这些同步调用卸载到ThreadPool 线程,但这只会有助于提高响应能力,而不会以任何方式提高性能。

【讨论】:

  • 如果是BeginX/EndX,您可以使用FromAsync 工厂方法而不是TaskCompletionSource<T>。见msdn.microsoft.com/en-us/library/…
  • @RicoSuter 当然......这是一个概括。 FromAsync 使用与 TaskCompletionSource 相同的任务 API。
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多