簡體   English   中英

如何啟動已停止的線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM