暂停并恢复线程

时间:2011-06-24 17:29:54

标签: c# .net multithreading

我有这段代码暂停和恢复一个帖子:

    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

4 个答案:

答案 0 :(得分:1)

您是否考虑使用Background Worker,因为您使用的是WinForms?它可能比尝试“暂停”一个线程更容易。您可以检查CancellationPending属性以查看用户是否已选择取消该操作。该链接有一个很好的样本可供查看。

答案 1 :(得分:0)

我从未见过有人暂停线程。在单独的威胁上执行的类或方法中创建委托和事件。每当你想要暂停你的thred时执行该事件。

答案 2 :(得分:0)

如果在第二次耗费操作之前放置,我没有任何理由可以阻止第二次调用WaitOne。由于您使用的是ManualResetEvent,因此等待句柄的状态将持续存在,直到调用SetReset为止。这意味着如果您通过调用Set恢复该线程,则对WaitOne的两次调用都将通过。同样,如果您通过调用Reset暂停线程,则对WaitOne的两次调用都将被阻止。当然,如果对WaitOne进行多次调用,则无法预测工作线程将暂停的位置。

答案 3 :(得分:0)

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

感谢您的帮助。