线程以代码0(0x0)退出,没有未处理的异常。

142

在调试我的 C# 应用程序时,我注意到了大量出现以下语句:

线程 -- 已使用代码 0 (0x0) 退出。

应用程序继续工作,并且没有捕获/未处理的异常。

该应用程序在 Windows 7 64位上运行,并使用 x86 平台进行调试。


1
你确定那些是你的线程吗?如果是,你不希望它们完成吗? - SLaks
8个回答

227

这只是一条调试信息。您可以右键单击输出窗口并取消选中 Thread Exit Messages 来关闭它。

http://msdn.microsoft.com/en-us/library/bs4c1wda.aspx

除了程序输出外,输出 窗口还可以显示以下信息:

  • 调试器已加载或卸载的模块。

  • 抛出的异常。

  • 退出的进程。

  • 退出的线程。


我在使用Visual Studio编写C++小游戏时遇到了这些消息,而且消息出现的时间正好与程序暂停一小段时间的时刻重合。目前我没有在程序中有意地使用线程,所以我想知道到底发生了什么事情。我打算尝试在发布模式下构建并在Visual Studio之外运行程序。 - Shavais
嗯,即使在发布模式下构建并在 Visual Studio 之外运行,我仍然会偶尔遇到线程退出冻结故障,所以我猜这一定是我的某个库中的问题。 - Shavais

21

嗯,一个应用程序可能会同时运行很多线程。有些是由您编写的代码运行的,有些是由框架类运行的(特别是如果您处于GUI环境中)。

当线程完成其任务后,它将退出并停止存在。 这并不令人担忧,你不需要关心。


我所讨论的线程不属于我自己(或者说,并不属于我的应用程序)。但是,我的应用程序需要连接到一个Linux AIX服务器,该服务器返回大量的僵尸进程。我对这个服务器的工作方式(以及它的任务)没有清晰的了解,但我猜测上述线程可能会影响服务器的性能表现。 - Gionata
也许线程实际上会影响您的应用程序,但您收到的消息告诉您它们成功终止。因此,您可以尝试找出它们为什么运行(调试菜单=>窗口=>线程),但这是正常的,它们最终都会结束。 - Kek
它们通常会正常结束,但Linux服务器的僵尸进程可能是.NET框架线程的副作用。也许应用程序在多线程实现中存在各种编程错误。这是可能的吗? - Gionata
我不知道。这个Linux服务器是运行.NET还是使用Mono?你实际上的问题是什么?僵尸进程吗? - Kek
是的,失效的进程导致了Linux服务器崩溃。 - Gionata

14
为了完成BlueM的被接受答案,您可以在此处进行取消激活:

工具 > 选项 > 调试 > 一般输出设置 > 线程退出消息:关闭


13
BlueM的采纳答案实际上有一个更简单的解决方案:“您可以通过右键单击输出窗口并取消选中线程结束消息来关闭它”。 - Simon MᶜKenzie

7
如果您的应用程序直接或间接地使用线程(例如在第三方库中),那么线程在完成后终止是非常普遍的,这基本上就是您所描述的情况。调试器会显示此消息 - 如果您不想要它,可以配置调试器不显示此消息。

2

执行Linq查询可能会生成额外的线程。 当我尝试在即时窗口中执行使用Linq查询集合的代码时,它经常拒绝运行,因为调试器没有足够的线程可用。

正如其他人所说,当线程完成时退出是完全正常的。

Translated:

执行 Linq 查询可能会生成额外的线程。当我尝试在立即窗口中执行使用 Linq 查询集合的代码时,由于调试器没有足够的线程可用,它经常会拒绝运行。

正如其他人所说,当线程完成时退出是完全正常的。


1
该框架创建线程以支持您创建的每个窗口,例如,当您创建一个表单并显示它时。当窗口关闭时,线程将被终止(即它们退出)。
这是正常行为。但是,如果应用程序正在创建线程,并且存在许多与这些线程对应的线程退出消息(可以通过为应用程序中的线程分配不同的名称来判断可能),那么这可能表明应用程序在不应创建线程的情况下存在问题,源于程序逻辑错误。
了解原始发布者关于服务器崩溃问题发现了什么会是一个有趣的后续步骤。我有一种感觉它与此无关...但很难从发布的信息中确定。

-3

要停止这个错误,您需要按照以下简单步骤操作:

  1. 打开Visual Studio
  2. 从顶部选择调试选项
  3. 选择选项
  4. 在选项中选择调试,然后选择常规
  5. 在常规中,选中“调试停止时自动关闭控制台”的复选框
  6. 保存

然后使用快捷键Ctrl+f5运行代码。

否则,直接运行它仍会显示错误。


-5

我也遇到了这个问题,解决方法如下:

  1. 打开“解决方案资源管理器”
  2. 双击“Program.cs”文件

我再次添加了这段代码后,程序运行得很准确:

Application.Run(new PayrollSystem()); 
//File name this code removed by me accidentally.

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