Как запустить остановленный поток
Я создаю новый поток и запустить его из основного потока.
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();
}
это работает, если поток был ранее остановлен.