我正在用C#编写一个客户端,它正在与使用boost C++异步调用的Windows asio DLL进行通信。我以前读过,ASIO在托管环境中不能很好地工作。VC++ DLL是为I/O处理程序创建非托管线程的非托管项目。C#代码创建了一个后台线程来处理通过pinvoke向C++ DLL发送消息。我的问题是-对boost::asio::async_write方法的调用可以在托管线程上进行吗?或者,它必须在非托管线程上吗?
如果我可以在托管线程上调用async_write,这将有助于简化逻辑和处理。但是,我担心当.NET垃圾收集器运行并停止线程时会发生什么。我不知道ASIO是否有能力处理这件事。我没有传递任何指向C#代码中定义的数据的指针,所以这应该不是问题。
发布于 2013-02-16 08:40:52
“托管线程”的概念是一个薄弱的概念,操作系统只支持一种线程。运行托管代码的线程并不特殊,托管代码会被翻译成与C编译器生成的机器代码完全相同的类型。唯一的区别是,CLR知道线程,并且在垃圾收集发生时有理由查看它的堆栈。查找可能包含对象引用的托管代码堆栈帧所必需的。
它不会对任何属于本机代码的堆栈框架感兴趣,它只是忽略它们。是的,当GC执行搜索时,线程可能会暂停,但仅当它当前正在执行托管代码时。本机代码继续运行,如果GC正在进行,它只会在返回到托管方法时阻塞。这种暂停与线程可能暂停的任何其他类型的原因没有什么不同,包括当操作系统调度程序运行其他东西时失去处理器一段时间。
所以使用boost::asio是很好的,没有任何问题。就像托管程序可以执行本机代码的许多其他方式一样,包括操作系统调用。您需要注意的唯一细节是确保在编译代码时不使用有效的/clr。将boost代码编译成IL运行良好,只是效率不是很高。
https://stackoverflow.com/questions/14905104
复制相似问题