暂停并恢复线程

本文关键字:线程 恢复 暂停 | 更新日期: 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,因此等待句柄的状态将一直持续到调用SetReset为止。这意味着,如果您通过调用Set来恢复线程,那么对WaitOne的两个调用都将通过。同样,如果您通过调用Reset来暂停线程,那么对WaitOne的两个调用都将被阻塞。当然,如果有多个对WaitOne的调用,则无法预测工作线程将在哪里暂停。

明白了!问题是你把WaitOne()放在哪里。例如,如果我有一个While循环(就像我的例子一样),如果我把等待放在它之前,无论我按下暂停按钮多少次,它都不会停止线程,这是逻辑的,因为循环已经开始了,但如果我把它放在最后,那么它就会工作。

感谢你的帮助。