线程退出代码是什么?

117

在进行调试时,“线程退出代码”指的是什么?它提供了什么信息?它是否有用或者只是一些不必关心的内部信息?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

有没有可能有一种可能的退出代码列表以及它的含义?

3个回答

101

实际上关于这个主题好像并没有很多解释,但是退出代码应该用于指示线程如何退出,0倾向于表示它安全退出,而其他任何东西倾向于表示它没有按预期退出。但是,你可以在代码中设置此退出代码,以完全忽略它。

我找到的最接近有用信息的链接是这个

引用来自上面的链接:

无论退出的方法如何,您从进程或线程返回的整数必须是0-255(8位)的值。零值表示成功,而非零值表示失败。尽管您可以尝试返回任何整数值作为退出代码,但只有该整数的最低字节作为退出代码的一部分从进程或线程返回。高阶字节由操作系统用于传达有关进程的特殊信息。退出代码在批处理/ shell程序中非常有用,这些程序根据一个程序的成功或失败有条件地执行其他程序。


来自GetEXitCodeThread文档:

重要提示:GetExitCodeThread函数仅在线程终止后才返回应用程序定义的有效错误代码。 因此,应用程序不应将STILL_ACTIVE(259)用作错误代码。 如果线程返回STILL_ACTIVE(259)作为错误代码,则测试此值的应用程序可能会将其解释为线程仍在运行,并在线程终止后继续测试线程的完成,这可能使应用程序陷入无限循环。

我对这一切的理解是,如果你在自己的应用程序中使用线程来服务于它本身,那么退出代码并不是很重要。例外情况可能是当你同时运行几个有依赖关系的线程时。如果需要外部源读取此错误代码,则可以将其设置为让其他应用程序了解您的线程的状态。


1
有没有办法将它从输出窗口中清除? - Arne Evertsson
27
@ArneEvertsson - 如果您进入“工具|选项...”下的“调试\输出窗口”区域,那里有一个“线程退出消息”(开启|关闭)设置。 - josh poley
2
这可能意味着您正在主线程中使用异步方法,而不是等待它们完成。处理这种情况的最简单方法是在另一个方法启动和返回的任务上调用Wait(),如此示例所示:http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client RunAsync().Wait(); - Bron Davies
1
@BronDavies 线程池在调用 Wait() 方法后以错误代码259退出。这是我的代码:
static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); } 问题在于,任务由线程池线程执行,基于线程池的启发式算法,即使您的任务已经完成,它可能不会终止该线程。该线程只是返回到等待分配下一个任务的线程池线程池中。这就是为什么此处的退出代码 STILL_ACTIVE(259)听起来如此直观的原因。
- RBT
链接中的文章是错误的。线程退出代码(或进程退出代码)不一定只能是一个字节。 - Harry Johnston
这可能与这个问题有关:链接。当我尝试构建和运行一个解决方案时,我得到了259的退出代码,并且它无法运行。我取消选中属性>>调试>>“启用Visual Studio托管进程”,就像@EatAtJoes的答案一样。我可以在任务管理器中看到MyProject.vshost.exe,但我无法杀死它。禁用托管进程并保存解决方案可以消除实时进程中的任务,也可以消除259消息,并且我的解决方案可以正常运行。 - DanG

55

就像Sayse所提到的那样,在这种情况下,退出码259(0x103)有着特殊的意义,也就是被调试的进程仍在运行。

我在调试 Web 服务时经常会看到这种情况,因为线程在执行每个 Web 服务调用后继续运行(因为它仍在等待进一步的调用)。


7
通常情况下,任何由线程池拥有的线程都将以259退出。请参考:https://dev59.com/KHzaa4cB1Zd3GeqPNT3U - Skrymsli
我想知道这是什么意思,你的答案恰好就是我在运行C#控制台应用程序时看到的。谢谢! - kayleeFrye_onDeck

0
我遇到的问题是我的解决方案中有多个项目。我本来想调试项目1,但是项目2被设置为默认启动项目。我通过右键单击该项目并选择“设置为启动项目”,然后进行调试即可解决这个问题。

1
我并不认为在输出窗口中看到调试信息是问题。我只是好奇它们是什么,而不是如何摆脱它们。 - Ondrej Janacek

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