我对臭名昭着的消息“线程xxx已退出代码0(0x0)”有疑问。
在我的代码中,我有一个名为“Load”的主类,它以Windows窗体加载事件开始:
public class Load
{
public Load()
{
Device[] devices = GetDevices(); // Get an array of devices from an external source
for (int i = 0; i < devices.Length; i++)
{
DeviceDiagnosticCtrl deviceDiagnostic = new DeviceDiagnosticCtrl(devices[i].name);
}
}
}
在构造函数中,对于从外部源读取的每个通用设备,我初始化一个运行线程的自定义诊断类:
public class DeviceDiagnosticCtrl
{
private Thread diagnosticController;
private volatile bool diagnosticControllerIsRunning = false;
public DeviceDiagnosticCtrl(string _name)
{
// Thread initialization
this.diagnosticController = new Thread(new ThreadStart(this.CheckDiagnostic));
this.diagnosticController.Start();
this.diagnosticControllerIsRunning = true;
}
private void CheckDiagnostic()
{
while (this.diagnosticControllerIsRunning)
{
try
{
// Custom 'Poll' message class used to request diagnostic to specific device
Poll poll = new Poll();
// Generic Message result to diagnostic request
IGenericMessage genericResult;
// Use a custom driver to send diagnostic request
SendSyncMsgResult res = this.customDriver.SendSyncMessage(poll, out genericResult);
switch (res)
{
case SendSyncMessageResult.GOOD:
{
// Log result
}
break;
case SendSyncMessageResult.EXCEPTION:
{
// Log result
}
break;
}
Thread.Sleep(this.customDriver.PollScantime);
}
catch (Exception ex)
{
// Loggo exception
}
}
}
}
当我在调试模式下运行上面的代码时,我总是从外部源读取8个设备,并且对于每个设备,我连续运行托管线程来检索诊断。 我的问题是,我从上面的代码中预期的8个线程中随机中的一个或多个以代码0退出,没有任何异常。
我已经花了很多时间在调试模式下启动/重启代码,几乎每次都有一个线程退出。
我已经阅读了某处(i.e. this SO question),它可能取决于垃圾收集器操作,但我不太确定这是否是我的情况 - 以及如何防止它。
有人在我上面发布的示例代码中看到了一些奇怪/错误的内容吗?有什么建议吗?
答案 0 :(得分:2)
'while(this.diagnosticControllerIsRunning)'很可能立即失败,在这种情况下线程会丢失。启动线程并设置'this.diagnosticControllerIsRunning = true;'并不好。 - 你很可能太晚了。
螺栓/稳定门。类似的东西:
do{
lengthyStuff with Sleep() in it
}
while (this.diagnosticControllerRun);
答案 1 :(得分:1)
从Here
复制在运行程序时右键单击“输出”窗口 取消选中您不想看到的所有消息(如线程退出 消息)。