如何启动已停止的线程

时间:2011-07-05 04:37:18

标签: c# .net winforms multithreading

我创建一个新线程并从主线程启动它。

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

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

5秒后,此线程将完成并且其ThreadState已停止。我想在用户点击按钮时再次启动它,但我得到ThreadStateException (Thread is running or terminated; it cannot restart)

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

请帮我解决如何重启停止的线程。感谢。

5 个答案:

答案 0 :(得分:9)

我知道这个问题有点陈旧,但我想如果其他人来这里我会发表回复。

对于此示例代码,如果它被更改为如下所示:

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

这将创建一个新的线程实例并启动它。 ThreadStateException错误是因为,您无法重新启动处于停止状态的线程。 m_MyThread.Start()仅对Unstarted状态的线程有效。在这种情况下需要做的是创建一个新的线程实例并在新实例上调用Start()

答案 1 :(得分:3)

使用ManualResetEvent,而不是Thread.Sleep,等待事件超时。

然后,任何其他线程都可以激活该事件,并立即恢复休眠线程。

一旦线程退出,它就不能再运行了。所以不要让它退出。相反,让它回到睡眠状态等待一个事件。

答案 2 :(得分:2)

如果要在每次都没有新线程的情况下重用线程,可以考虑线程池的实现。

答案 3 :(得分:1)

只需创建一个新线程,就像最初创建线程时一样。你可能还想把它拉出来避免重复自己。

答案 4 :(得分:0)

要重新启动线程,请尝试以下操作:

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

如果线程先前已停止,则此方法有效。