什么是线程退出代码?


115

调试时“输出”窗口中的线程退出代码到底是什么?它给我什么信息?它以某种方式有用吗,还是只是一个不应该打扰我的内部东西?

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

是否存在某种可能的退出代码列表及其重要性?

Answers:


100

显然,在这个问题上似乎没有太多的解释,但是应该使用退出代码来指示线程如何退出,0倾向于表示线程安全退出,而其他任何事物都表明线程没有退出。不能按预期退出。但是,您可以自己在代码中设置此退出代码,以完全忽略它。

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

从上面的链接引用:

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


GetEXitCodeThread的文档中

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


我对这一切的理解是,如果您将自己的应用程序中的线程用于自己的应用程序,则退出代码并没有多大关系。如果您同时运行两个相互依赖的线程,则可能是一个例外。如果需要外部源读取此错误代码,则可以将其设置为让其他应用程序知道您的线程状态。


1
有没有办法从“输出”窗口中删除它?
Arne Evertsson 2014年

26
@ArneEvertsson-如果您进入“工具” | 选项...在“调试\输出窗口”区域下,有一个“线程退出消息”(On | Off)设置。
josh poley 2014年

2
这可能意味着您正在同步应用程序主线程中使用异步方法,而不是等待它们完成。对付这种情况的最简单方法是调用wait()在任务开始,通过其他方法返回显示此示例中:asp.net/web-api/overview/advanced/... RunAsync().Wait();
勒布朗·戴维斯

1
即使调用Wait()之后,@ BronDavies线程池线程也会以错误代码259退出。这是我的代码: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }问题是,任务是由线程池线程执行的,并且基于线程池的启发式方法,即使任务完成后,它也可能不会终止线程。线程只是返回线程池,等待分配下一个任务。这就是为什么退出代码STILL_ACTIVE(259)在这里听起来如此直观的原因。
RBT

链接中的文章是错误的。不必要求线程退出代码(或与此相关的进程退出代码)只能是一个字节。
哈里·约翰斯顿

55

正如Sayse所述,退出代码259 (0x103)具有特殊含义,在这种情况下,正在调试的进程仍在运行。

在调试Web服务时,我看到了很多东西,因为线程在执行每个Web服务调用后继续运行(因为它仍在侦听其他调用)。


7
更多信息..通常由线程池拥有将与259.见退出任何线程:stackoverflow.com/questions/21632584/...
Skrymsli

我想知道这意味着什么,而您的回答正是我在运行C#控制台应用程序时看到的。谢谢!
kayleeFrye_onDeck

0

我发生的事情是我的解决方案中有多个项目。我打算调试项目1,但是将项目2设置为默认的启动项目。我通过在项目上右键单击并选择“设置为启动项目”来解决此问题,然后运行调试就可以了。


1
我没有在“输出”窗口中看到调试消息是问题。我只是好奇它们是什么,而不是如何摆脱它们。
Ondrej Janacek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.