在C#和.NET中,ExitThread(ExitCode)和GetExitCodeThread的等效方法是什么?

5
阅读VS2008帮助文件后,我发现在.NET中退出线程的清洁方法是使用return语句(在C#中)或让线程到达方法的结尾。
然而,我没有找到一个允许我设置线程退出代码或检索它的方法或属性(就像使用Win32 API那样)。因此,问题是,我如何使用C#和.NET实现这一点?
谢谢您的帮助,
John.
1个回答

7
为了防止受控代码依赖于它们,底层的 Win32 线程原语不会被暴露出来。CLR 团队一直在寻找优化线程使用的方法,其中包括对 1:1 受控线程与非托管线程映射不做任何保证(例如请参见此 MSDN 页面上的注释)。如果您确实想要这样做,就需要设置使用 Win32 GetCurrentThread() 中的非托管线程句柄的 P/Invoke 封装器,或使用自定义宿主钩入线程映射过程。除非您必须与使用线程退出代码且不具备托管代码意识的内容进行交互,否则我不建议使用任何一种方法。如果可以完全使用托管代码,请找到另一种方法来传递状态信息(或使用任务并行库来从裸线程抽象上升一级)。

nitzmahone,感谢您的回复和提供的链接。由于托管线程和操作系统线程之间没有一对一的对应关系,我认为使用Pinvoking ExitThread和GetExitCodeThread不是一个可靠的解决方案。我正在考虑从Thread派生一个新的线程类,该类添加了一个退出代码以及设置和检索它的适当方法。我的担忧是,由于在线程终止后检索退出代码,GC可能已经在检索退出代码之前处理了线程对象。有没有办法保证这种情况不会发生? - Hex440bx
我怀疑你在那里也不会得到好的结果——线程被封闭,而且有充分的理由。如果你考虑构建一个不使用Win32退出代码机制的东西,为什么不使用已经存在的用于跟踪逻辑线程状态的更高级别的结构(前面提到的TPL等)?或者,你可以做一些简单的事情,比如使用托管线程ID和“退出代码”的静态字典——保证能够生存得足够长。我不知道你项目的所有细节,但听起来你正在试图让生活变得比它需要的更加困难... - nitzmahone
真正的问题是我正在学习.net和C#。我在普通Windows API方面非常有知识,因此我尝试将我对使用WinAPI的了解与在.net和C#中做同样的事情相匹配。显然,这种方法有其“问题”,但通常很好。在这种情况下,听起来我只需要学更多才能找出如何用.net的方式来完成任务。感谢您的帮助和建议。约翰。 - Hex440bx
一旦您使用TPL进行实际操作,您将会诅咒Win32的方式。祝您旅途愉快... :) - nitzmahone
完成基础学习后,我会确保查看TPL。谢谢 :-) - Hex440bx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接