繁体   English   中英

使第三方 I/O DLL 异步

[英]Making third party I/O DLL asynchronous

我需要使用第三方 DLL,它使用阻塞调用实现 TCP 套接字客户端(在 C++ 中)。 所以基本上(伪代码);

void DoRequest()
{
  send(myblockingSocket,data); 
  recv(myblockingSocket,responsedata);
}

使用 async-await 使这些调用在 .NET 中作为异步调用可访问的推荐方法是什么(不更改原始 DLL)

我读到: https://docs.microsoft.com/en-us/dotnet/standard/async-in-depth#deeper-dive-into-tasks-for-an-io-bound-operationhttps://docs .microsoft.com/en-us/dotnet/csharp/async和其他几个页面,除了生成新任务之外没有找到其他解决方案,由于任务创建开销,不建议对 I/O 绑定操作执行此操作。

使用 async-await 使这些调用在 .NET 中作为异步调用可访问的推荐方法是什么(不更改原始 DLL)?

没有推荐的解决方案,因为这是不可能的。 必须更改/替换 DLL 本身以支持异步,否则异步调用将只是在后台线程上运行同步代码 - 我称之为“假异步”,因为它看起来是异步的,但实际上无论如何都占用了一个线程.

...没有找到比生成新任务的其他解决方案,由于任务创建开销,不建议在 I/O 绑定操作上执行此操作。

实际上不建议这样做有几个原因:

  1. 它依赖于上游代码。 如果不是,它会说“这个 API 是异步的”。 这可能导致消费者做出错误的决定,例如,在服务器场景中更喜欢异步 API。
  2. 它没有提供任何实际好处。 使用Task.Run实现方法会强制消费者使用额外的线程。 如果您只是保持 API 同步,那么消费者可以根据需要选择是否使用Task.Run调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM