[英]How to start a stopped thread
我創建一個新線程並從主線程啟動它。
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
}
請幫助我如何重新啟動已停止的線程。 謝謝。
我知道這個問題有點老了,但我想我會發布一個回復,以防其他人來這里。
對於此示例代碼,如果將其更改為如下所示:
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
錯誤是因為簡單地說,您無法重新啟動已停止的 state 中的線程。 m_MyThread.Start()
僅對Unstarted
state 中的線程有效。 在這種情況下需要做的是創建一個新的線程實例並在新實例上調用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();
}
如果線程先前已停止,則此方法有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.