Как запустить остановленную тему - PullRequest
9 голосов
/ 05 июля 2011

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

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 ]

9 голосов
/ 20 декабря 2011

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

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

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() для нового экземпляра.

3 голосов
/ 05 июля 2011

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

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

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

2 голосов
/ 05 июля 2011

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

1 голос
/ 05 июля 2011

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

0 голосов
/ 20 марта 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...