Spaceman
Spaceman

Reputation: 547

Random message "The thread has exited with code 0" in managed threads

I've a got a problem with the infamous message "The thread xxx has exited with code 0 (0x0)".

In my code I have a main class called "Load" that starts with a Windows Form load event:

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);
        }
    }
}

Inside the constructor, for each generic device read from an external source, I initialize a custom diagnostic class that runs a thread:

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
            }
        }
    }
}

When I run the above code in debug mode I always read 8 devices from external source, and for each of them I continuously run a managed thread to retrieve diagnostic. My problem is that randomly one or more of the 8 threads I expect from the code above exit with code 0, without any exception.

I've started/restarted the code in debug mode a lot of time, and almost everytime one of the thread exits.

I've read somewhere (i.e. this SO question) that it could depends of Garbage Collector action, but I'm not too sure if this is my case - and how to prevent it.

Do someone see something strange/wrong in the sample code I posted above? Any suggestion?

Upvotes: 0

Views: 3317

Answers (2)

Martin James
Martin James

Reputation: 24857

'while (this.diagnosticControllerIsRunning)' is quite likely to fail immediate, in which case the thread drops out. It's no good starting the thread and THEN setting 'this.diagnosticControllerIsRunning = true;' - you're quite likely to be too late.

Bolt/stable-door. Something like:

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

Upvotes: 2

Microsoft DN
Microsoft DN

Reputation: 10020

Copied from Here

Right click in the Output window when you're running your program and uncheck all of the messages you don't want to see (like Thread Exit messages).

Upvotes: 1

Related Questions