如何启动停止的线程

本文关键字:线程 启动 何启动 | 更新日期: 2023-09-27 18:01:01

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

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

5秒钟后,此线程将结束,其ThreadState为Stopped。当用户点击按钮时,我想再次启动它,但我得到了ThreadStateException (Thread is running or terminated; it cannot restart):

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

请帮助我如何重新启动停止的线程。谢谢

如何启动停止的线程

我知道这个问题有点老了,但我想我会发布一个回复,以防其他人来这里。

对于这个示例代码,如果将其更改为如下所示:

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

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

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

一旦线程退出,它就不能再运行了。所以不要让它退出。相反,让它重新入睡,等待一个事件。

如果你想重用线程而不每次都新建一个线程,你可以考虑线程池的实现。

只需像最初创建线程时那样创建一个新线程。你可能还想把它变成一种方法,以避免重复你自己。