什么是线程退出代码?

Ond*_*cek 112 c# debugging multithreading exit-code

调试时,"输出"窗口中的线程退出代码究竟是什么?它给了我什么信息?它在某种程度上是有用的还是只是一个不应该打扰我的内部东西?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).
Run Code Online (Sandbox Code Playgroud)

可能有某种可能的退出代码列表及其重要性吗?

Say*_*yse 100

实际上似乎没有很多关于这个问题的解释,但是退出代码应该被用来表示线程如何退出,0往往意味着它安全退出而其他任何东西往往意味着它没有不按预期退出.但是这个退出代码可以在代码中自行设置,完全忽略了这一点.

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

从上面链接引用:

退出的方法是什么,从进程或线程返回的整数必须是0-255(8位)的值.零值表示成功,而非零值表示失败.虽然,您可以尝试返回任何整数值作为退出代码,但只有整数的最低字节作为退出代码的一部分从您的进程或线程返回.操作系统使用更高阶的字节来传达有关该过程的特殊信息.退出代码在批处理/ shell程序中非常有用,它有条件地执行其他程序,具体取决于一个程序的成功或失败.


来自GetEXitCodeThread的文档

要点:GetExitCodeThread函数仅在线程终止后才返回应用程序定义的有效错误代码.因此,应用程序不应使用STILL_ACTIVE(259)作为错误代码.如果一个线程将STILL_ACTIVE(259)作为错误代码返回,那么测试该值的应用程序可能会将其解释为线程仍在运行并在线程终止后继续测试线程的完成情况,这可能会导致应用到无限循环中.


我这一切的理解是,退出代码并不重要,所有的东西,如果你正在使用自己的应用程序中的线程用于自己的应用程序.如果您同时运行两个彼此依赖的线程,则可能是个例外.如果需要外部源来读取此错误代码,则可以将其设置为让其他应用程序知道您的线程的状态.

  • @ArneEvertsson - 如果你进入工具| 选项...在"调试\输出窗口"区域下,有一个"线程退出消息"(开|关)设置. (26认同)
  • 这可能意味着您正在同步应用程序主线程中使用异步方法,而不是等待它们完成。解决此问题的最简单方法是在另一个示例所显示和启动的Task上调用Wait(),如本示例所示:http://www.asp.net/web-api/overview/advanced/calling-a-从网络客户端网络API`RunAsync()。Wait();` (2认同)

Kri*_*ams 55

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

我通过调试Web服务看到了很多,因为线程在执行每个Web服务调用后继续运行(因为它仍然在监听进一步的调用).

  • 更多信息..通常线程池拥有的任何线程将以259退出.请参阅:http://stackoverflow.com/questions/21632584/threads-spun-with-task-run-always-exit-with-exit -code-259 (7认同)