2012-04-18 205 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. 
    } 
}