2012-04-18 299 views
3

Thread.Suspend()方法已過時,如您所知。當按鈕點擊事件發生時,我想立即中止線程。我使用了Thread.Suspend(),它的工作原理非常完美,但是每個人都建議使用Thread.Suspend()方法不是一個很好的方法來暫停任務。我使用了一個標誌來暫停任務,但每次按下按鈕點擊事件時,我都必須等待退出任務。我使用Thread.IsAlive標誌等待線程退出,但此方法凍結窗體。Thread.Suspend()方法的替代方法

void ButtonClickEvent(object sender, ButtonClickEventArgs e) 
{ 
    TheadExitFlag = false; 

    if(MyThread != null) 
    { 
     while(MyThread.IsAlive); 
     //MyThread.Suspend(); 
    } 
} 

void MyTask(void) 
{ 
    while(TheadExitFlag) 
    { 
     // some process 
     Thread.Sleep(5000); 
    } 
} 

我該如何暫停該線程嗎?

+0

請更清楚你想做什麼 - 如果你想'暫停'線程或退出線程,我甚至不會100%確定。另一個例子:MyThread是對MyTask運行的線程的引用嗎?看起來像'ThreadExitFlag == true'意味着線程應該*不*退出;如果是這樣,我建議你改名。 – 2012-04-18 09:51:07

+0

你爲什麼要暫停線程? – user844541 2012-04-18 09:51:32

+0

我敢打賭,你試圖解決一個問題,使用錯誤的設施,爲什麼你需要暫停一個線程? – sll 2012-04-18 11:01:23

回答

4

AFAIK有相同的功能沒有替代。我不確定操作系統的問題是否可以在語言/庫中得到解決,但沒有嘗試過這樣做,所以也許這太難了,或者甚至是理智的不可能。

直到存在這樣一個變量時,您可以減少輪詢掛起標誌,然後等待某個同步對象獲得「恢復」信號。我爲此已使用AutoResetEvent

4

使用ManualResetEvent在運行狀態和空閒狀態之間切換。

ManualResetEvent run = new ManualResetEvent(true); 

void ResumeButton_Click(object sender, ButtonClickEventArgs e) 
{ 
    run.Set(); 
    PauseButton.Enabled = true; 
    ResumeButton.Enabled = false; 
} 

void PauseButton_Click(object sender, ButtonClickEventArgs e) 
{ 
    run.Reset(); 
    PauseButton.Enabled = false; 
    ResumeButton.Enabled = true; 
} 

void MyTask(void) 
{ 
    while (run.WaitOne()) // Wait for the run signal. 
    { 
     // Do work here. 
    } 
}