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