2011-04-11 80 views
4

阅读VS2008帮助文件我发现退出线程(在.net中)的干净方式是使用return语句(使用C#)或让线程到达方法的末尾。C#&.net中ExitThread(ExitCode)和GetExitCodeThread的等效参数是什么?

但是,我还没有找到一个方法或属性,可以让我设置线程的退出代码,也没有一种方法来检索它(因为它是使用Win32 API完成的)。因此,问题是,如何使用C#和.net来执行此操作?

谢谢你的帮助,

约翰。

回答

7

底层Win32线程原语未公开的原因是为了防止托管代码依赖它们。 CLR团队一直致力于优化线程使用的方法,并且不包括有关1:1托管:非托管线程映射的保证(请参阅this MSDN page上的“注意”部分)。如果你真的想要这样做,你需要设置P/Invoke包装器,它使用Win32 GetCurrentThread()中的非托管线程句柄,或者使用自定义主机自己挂接到线程映射过程。我也不会推荐,除非你绝对必须与使用线程退出代码的东西进行互操作,并且不能管理代码感知。找出另一种走私状态信息的方法,如果你可以全部管理它(或使用Task Parallel Library从裸线上提取一个级别)。

+0

nitzmahone,谢谢你的回复和链接。鉴于托管线程和O/S线程之间没有1:1的对应关系,我认为Pinvoking ExitThread和GetExitCodeThread不会是可靠的解决方案。我正在考虑从Thread中派生一个新的线程类,它添加一个退出代码以及适当的方法来设置它并检索它。我担心的是,由于在线程终止后检索退出代码,GC可能在检索退出代码之前处理了线程对象。有没有办法保证不会发生? – Hex440bx 2011-04-12 13:05:37

+0

我怀疑你会在那里得到好的结果 - 线程是密封的,并有充分的理由。如果你正在考虑构建一些不使用Win32退出代码机制的东西,为什么不使用已经存在的更高层次的结构来跟踪逻辑线程状态(前面提到的TPL等)呢?或者,您可以像管理线程ID和“退出代码”的静态字典一样简单 - 保证按照您的需要生活。不知道你的项目的所有细节,但它听起来像你试图让生活比它需要更难... – nitzmahone 2011-04-12 18:04:45

+0

真正的问题是,我只是学习.NET和C#。我对纯Windows API非常了解,因此,我尝试将我所了解的使用WinAPI进行匹配以在.net和C#中执行相同的操作。显然,这种方法有其“问题”,但通常很好。在这种情况下,这听起来像我只需要学习更多的东西来弄清楚如何以.net的方式进行操作。感谢您的帮助和建议。约翰。 – Hex440bx 2011-04-12 22:21:37

相关问题