当某些事件发生时,如何暂停线程并继续?
我希望当一个按钮被点击时线程继续。有人告诉我,thread.suspend
不是暂停线程的合适方式。有没有其他的解决方案?
发布于 2011-01-31 06:22:33
你可以使用System.Threading.EventWaitHandle。
EventWaitHandle会一直阻塞,直到收到信号为止。在本例中,它将由按钮单击事件发出信号。
private void MyThread()
{
// do some stuff
myWaitHandle.WaitOne(); // this will block until your button is clicked
// continue thread
}
你可以像这样给你的等待句柄发信号:
private void Button_Click(object sender, EventArgs e)
{
myWaitHandle.Set(); // this signals the wait handle and your other thread will continue
}
发布于 2011-01-31 06:12:23
实际上,挂起线程是一种不好的做法,因为您很少确切地知道线程当时在做什么。让线程经过一个ManualResetEvent
,每次调用WaitOne()
会更容易预测。这将充当一个门-控制线程可以调用Reset()
关闭门(暂停线程,但安全),并调用Set()
打开门(恢复线程)。
例如,您可以在每次循环迭代开始时调用WaitOne
(如果循环太紧,则每隔一次n
迭代调用一次)。
发布于 2013-07-26 18:14:49
你也可以试试这个
private static AutoResetEvent _wait = new AutoResetEvent(false);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Dosomething();
}
private void Dosomething()
{
//Your Loop
for(int i =0;i<10;i++)
{
//Dosomething
_wait._wait.WaitOne();//Pause the loop until the button was clicked.
}
}
private void btn1_Click(object sender, EventArgs e)
{
_wait.Set();
}
https://stackoverflow.com/questions/4848064
复制