[英]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-operation和https://docs .microsoft.com/en-us/dotnet/csharp/async和其他几个页面,除了生成新任务之外没有找到其他解决方案,由于任务创建开销,不建议对 I/O 绑定操作执行此操作。
使用 async-await 使这些调用在 .NET 中作为异步调用可访问的推荐方法是什么(不更改原始 DLL)?
没有推荐的解决方案,因为这是不可能的。 必须更改/替换 DLL 本身以支持异步,否则异步调用将只是在后台线程上运行同步代码 - 我称之为“假异步”,因为它看起来是异步的,但实际上无论如何都占用了一个线程.
...没有找到比生成新任务的其他解决方案,由于任务创建开销,不建议在 I/O 绑定操作上执行此操作。
实际上不建议这样做有几个原因:
Task.Run
实现方法会强制消费者使用额外的线程。 如果您只是保持 API 同步,那么消费者可以根据需要选择是否使用Task.Run
调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.