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”时,这对我不起作用,也许我必须再次检查。谢谢你,布莱恩