简体   繁体   中英

How to start a stopped thread

I create a new thread and start it from a main thread.

m_MyThread = new Thread(HandleMyThread);
m_MyThread.IsBackground = true;
m_MyThread.Start();

private void HandleMyThread()
{
    while (true)
    {
        Thread.Sleep(5000);
        return;
    }
}

After 5 seconds, this thread will finish and its ThreadState is Stopped. I want to start it again when user clicks on button but I get a ThreadStateException (Thread is running or terminated; it cannot restart) :

private void button1_Click(object sender, EventArgs e)
{
    m_MyThread.Start(); // ->raise exception
}

Please help me how to restart a stopped thread. Thanks.

I know this question is a bit old, but I thought I would post a response in case others come here.

For this example code, if it were changed to look like this:

Thread m_MyThread;
private void HandleMyThread()
{
    while (true)
    {
        Thread.Sleep(5000);
        return;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    if (!m_MyThread.IsAlive)
    {
        m_MyThread = new Thread(HandleMyThread);
        m_MyThread.IsBackground = true;
        m_MyThread.Start();
    }
}

This would create a new instance of the thread and start it. The ThreadStateException error is because, simply, you can't re-start a thread that's in a stopped state. m_MyThread.Start() is only valid for threads in the Unstarted state. What needs done in cases like this is to create a new thread instance and invoke Start() on the new instance.

Use a ManualResetEvent , and instead of Thread.Sleep , wait for the event with a timeout.

Then, any other thread can activate the event, and immediately resume the sleeping thread.

Once a thread is exited, it can no longer run. So don't let it exit. Instead, put it back to sleep waiting for an event.

If you want to reuse the thread without new a thread every time, you can consider the implementation of thread pool.

Just make a new thread like you did when you initially created the thread. You might also want to pull that out into a method to avoid repeating yourself.

To restart a thread, try this:

private void button1_Click(object sender, EventArgs e)
{
    // Just create a new constructor for the stopped Thread
    m_MyThread = null;
    m_MyThread = new Thread(HandleMyThread);
    m_MyThread.IsBackground = true;
    // Then restart the stopped Thread
    m_MyThread.Start();
}

This works if the thread was previously stopped.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM