暂停并恢复线程
本文关键字:线程 恢复 暂停 | 更新日期: 2023-09-27 18:00:24
我有以下代码来暂停和恢复线程:
public partial class frmMain : Form
{
(...)
ManualResetEvent wait_handle = new ManualResetEvent(true);
(...)
}
private void frmMain_Shown(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TheLoop));
}
private void TheLoop(object stateinfo)
{
bool hasInfo = true;
while (doLoop)
{
wait_handle.WaitOne();
bool hasLines = GetInfo();
if (hasLines)
{
//Consuming time Operation 1
System.Threading.Thread.Sleep(7000);
if (CurrentLine < line.Count - 1)
CurrentLine++;
else
{
bool hasInfo2 = GetInfo2();
if (hasInfo2)
{
//Consuming time Operation 2
System.Threading.Thread.Sleep(7000);
}
CurrentLine = 0;
}
}
else
System.Threading.Thread.Sleep(40000); //Wait to query again
}
}
private void btnPauseResume_Click(object sender, EventArgs e)
{
if (btnPauseResume.Text == "Pause")
{
btnPauseResume.Text = "Resume";
wait_handle.Reset();
}
else
{
btnPauseResume.Text = "Pause";
wait_handle.Set();
}
}
上面的代码显示了一个循环信息,它可以找到暂停并恢复"第一次耗时操作",但对第二次不起作用,如果我在第二次耗时操作中按下按钮暂停线程,这个操作会继续,当第一次再次出现时,它会暂停在那里。
我在这里错过了什么?Thx
自从使用WinForms以来,您是否考虑过使用后台工作程序?这可能比尝试"暂停"线程更容易。您可以检查CancellationPending属性,查看用户是否已选择取消操作。该链接有一个很好的示例。
我从未见过有人暂停线程。在对单独威胁执行的类或方法中创建委托和事件。只要您想暂停您的thred,就执行该事件。
我看不出有任何原因会阻止对WaitOne
的第二次调用在第二次耗时操作之前工作。由于您使用的是ManualResetEvent
,因此等待句柄的状态将一直持续到调用Set
或Reset
为止。这意味着,如果您通过调用Set
来恢复线程,那么对WaitOne
的两个调用都将通过。同样,如果您通过调用Reset
来暂停线程,那么对WaitOne
的两个调用都将被阻塞。当然,如果有多个对WaitOne
的调用,则无法预测工作线程将在哪里暂停。
明白了!问题是你把WaitOne()放在哪里。例如,如果我有一个While循环(就像我的例子一样),如果我把等待放在它之前,无论我按下暂停按钮多少次,它都不会停止线程,这是逻辑的,因为循环已经开始了,但如果我把它放在最后,那么它就会工作。
感谢你的帮助。