Как запустить остановленную тему

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

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

Это создаст новый экземпляр потока и запустит его. 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();
}

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

Другие вопросы по тегам