托管线程中的随机消息“线程已退出,代码为0”

时间:2013-11-27 13:58:37

标签: c# .net multithreading

我对臭名昭着的消息“线程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),它可能取决于垃圾收集器操作,但我不太确定这是否是我的情况 - 以及如何防止它。

有人在我上面发布的示例代码中看到了一些奇怪/错误的内容吗?有什么建议吗?

2 个答案:

答案 0 :(得分:2)

'while(this.diagnosticControllerIsRunning)'很可能立即失败,在这种情况下线程会丢失。启动线程并设置'this.diagnosticControllerIsRunning = true;'并不好。 - 你很可能太晚了。

螺栓/稳定门。类似的东西:

do{
  lengthyStuff with Sleep() in it
}
while (this.diagnosticControllerRun);

答案 1 :(得分:1)

Here

复制
  

在运行程序时右键单击“输出”窗口   取消选中您不想看到的所有消息(如线程退出   消息)。