我有这段代码暂停和恢复一个帖子:
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
答案 0 :(得分:1)
您是否考虑使用Background Worker,因为您使用的是WinForms?它可能比尝试“暂停”一个线程更容易。您可以检查CancellationPending属性以查看用户是否已选择取消该操作。该链接有一个很好的样本可供查看。
答案 1 :(得分:0)
我从未见过有人暂停线程。在单独的威胁上执行的类或方法中创建委托和事件。每当你想要暂停你的thred时执行该事件。
答案 2 :(得分:0)
如果在第二次耗费操作之前放置,我没有任何理由可以阻止第二次调用WaitOne
。由于您使用的是ManualResetEvent
,因此等待句柄的状态将持续存在,直到调用Set
或Reset
为止。这意味着如果您通过调用Set
恢复该线程,则对WaitOne
的两次调用都将通过。同样,如果您通过调用Reset
暂停线程,则对WaitOne
的两次调用都将被阻止。当然,如果对WaitOne
进行多次调用,则无法预测工作线程将暂停的位置。
答案 3 :(得分:0)
得到了家伙!你把WaitOne()放在哪里。例如,如果我有一个While循环(就像我的例子),如果我把它放在它之前,无论我多少次按下暂停按钮,它都不会停止线程,这是逻辑,因为循环已经开始,但是如果我把它放在最后,那么它会起作用。
感谢您的帮助。