0

我正在用 C# 编写一个客户端,它与使用 boost asio 异步调用的 Windows C++ DLL 进行通信。我之前读过,ASIO 在托管环境中不能很好地工作。VC++ DLL 是一个非托管项目,它为 I/O 处理程序创建一个非托管线程。C# 代码创建一个后台线程来处理通过 pinvoke 向 C++ DLL 发送消息。我的问题是-对 boost::asio::async_write 方法的调用可以在托管线程上吗?或者,它必须在非托管线程上吗?

如果我可以在托管线程上调用 async_write,这将有助于简化逻辑和处理。但是,我担心当 .NET 垃圾收集器运行并停止线程时会发生什么。我不知道 ASIO 是否能够处理这个问题。我没有传递任何指向 C# 代码中定义的数据的指针,所以这应该不是问题。

4

1 回答 1

4

“托管线程”的概念很弱,操作系统只支持一种线程。运行托管代码的线程并不特殊,托管代码被转换为 C 编译器生成的完全相同的机器代码。唯一的区别是 CLR 知道线程并且有理由在垃圾回收发生时查看它的堆栈。需要查找可能包含对象引用的托管代码的堆栈帧。

不会对属于本机代码的任何堆栈帧感兴趣,它只是忽略它们。是的,线程可能会在 GC 执行搜索时暂停,但前提是它当前正在执行托管代码。本机代码继续运行,如果 GC 正在进行,它只会在返回托管方法时阻塞。这种暂停与线程可能暂停的任何其他原因没有什么不同,包括在操作系统调度程序运行其他东西时失去处理器一段时间。

所以使用 boost::asio 很好,没有任何问题。就像托管程序可以执行本机代码的许多其他方式一样,包括操作系统调用。您需要注意的唯一细节是确保在 /clr 不生效的情况下编译您的代码。将 boost 代码编译为 IL 工作正常,只是效率不高。

于 2013-02-16T00:40:51.703 回答