C# 暂停并恢复线程
我有以下代码来暂停和恢复线程:C# 暂停并恢复线程,c#,.net,multithreading,C#,.net,Multithreading,我有以下代码来暂停和恢复线程: public partial class frmMain : Form { (...) ManualResetEvent wait_handle = new ManualResetEvent(true); (...) } private void frmMain_Shown(object sender, EventArgs e) {
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();
}
}
公共部分类frmMain:Form
{
(...)
ManualResetEvent wait_handle=新的ManualResetEvent(真);
(...)
}
显示私有无效frmMain_(对象发送方,事件参数e)
{
QueueUserWorkItem(新的WaitCallback(TheLoop));
}
私有void TheLoop(对象状态信息)
{
bool hasInfo=true;
while(doLoop)
{
等等;
bool hasLines=GetInfo();
if(hasLines)
{
//耗时操作1
系统线程线程睡眠(7000);
如果(当前线路<线路计数-1)
CurrentLine++;
其他的
{
bool hasInfo2=GetInfo2();
如果(hasInfo2)
{
//耗时操作2
系统线程线程睡眠(7000);
}
CurrentLine=0;
}
}
其他的
System.Threading.Thread.Sleep(40000);//等待再次查询
}
}
私有void btnPauseResume_单击(对象发送者,事件参数e)
{
如果(btnPauseResume.Text==“暂停”)
{
btnPauseResume.Text=“Resume”;
等待句柄。重置();
}
其他的
{
btnPauseResume.Text=“暂停”;
wait_handle.Set();
}
}
上面的代码显示了一个循环信息,它可以暂停并恢复“第一次耗时操作”,但对第二次耗时操作不起作用,如果我在第二次耗时操作中按下按钮暂停线程,此操作将继续,当第一次耗时操作再次出现时,它将在那里暂停
我错过了什么?
Thx我从未见过有人暂停线程。在针对单独威胁执行的类或方法内创建委托和事件。只要您想暂停thred,就执行该事件 既然您使用的是WinForms,您是否考虑过改用?这可能比尝试“暂停”线程更容易。您可以检查CancellationPending属性以查看用户是否已选择取消该操作。该链接有一个很好的示例可供查看。如果在第二次耗时操作之前调用
WaitOne
,我看不出有任何原因会阻止第二次调用。由于您使用的是ManualResetEvent
,等待句柄的状态将持续到调用Set
或Reset
为止。这意味着,如果通过调用Set
恢复线程,那么对WaitOne
的两个调用都将通过。同样,如果通过调用Reset
暂停线程,则对WaitOne
的两个调用都将被阻止。当然,如果有多个调用WaitOne
明白了,就无法预测工作线程将暂停在哪里!问题是你把WaitOne()放在哪里。例如,如果我有一个While循环(比如我的例子),如果我把wait放在它前面,不管我点击pause按钮多少次,它都不会停止线程,这是逻辑,因为循环已经开始了,但是如果我把它放在末尾,它就会工作
感谢您的帮助。更完整的代码可能会有所帮助。感谢您的编辑疯狂艺术,我读到不止一个wait_handle.WaitOne();是必需的每次我需要暂停或恢复线程时,我都尝试在操作2之前再添加一个线程,但不起作用。在耗时操作中,我从数据库读取数据并使用invoke在GUI中设置值。就这些,所以我不认为这会是问题。你好,托诺,但是你意识到我可以用上面的代码暂停并恢复线程,对吗?我唯一的问题是在第二次操作中能暂停线程。谢谢ZeroVector的回复,但是我在项目开始时没有考虑后台工作者,现在这个项目太大了,我不想再改变整个事情。所以我必须继续尝试暂停第二个操作。是的,所以,当按下按钮时,他们都应该暂停这两个操作,如果继续,则继续,但在第二个操作之前添加第二个“waitOne”时,这对我不起作用,也许我必须再次检查。谢谢你,布莱恩