Как запустить остановленный поток

Я создаю новый поток и запустить его из основного потока.

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 ответов


Если вы хотите повторно использовать поток без нового потока каждый раз, вы можете рассмотреть реализацию пула потоков.


Я знаю, что этот вопрос немного старый, но я думал, что отправлю ответ, если другие придут сюда.

для этого примера кода, если он был изменен, чтобы выглядеть следующим образом:

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

Это создаст новый экземпляр потока и запустить его. The ThreadStateException ошибка заключается в том, что вы просто не можете повторно запустить поток, который находится в остановленном состоянии. m_MyThread.Start() допустимо только для потоков в Unstarted государство. Что нужно сделать в таких случаях, как это, чтобы создать новый поток экземпляр и вызвать Start() на новый экземпляр.


использовать ManualResetEvent, а вместо Thread.Sleep, дождитесь события с таймаутом.

затем любой другой поток может активировать событие и немедленно возобновить спящий поток.

после выхода потока он больше не может работать. Так что не позволяйте ему выйти. Вместо этого, положите его спать в ожидании события.


просто сделайте новый поток, как вы сделали, когда вы изначально создали поток. Вы также можете вытащить это в метод, чтобы избежать повторения.


чтобы перезапустить поток, попробуйте следующее:

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

это работает, если поток был ранее остановлен.