C#线程暂停与开启

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

namespace AutoResetEventTest
{
   
public partial class Form1 : Form
    {
       
private ManualResetEvent manualResetEvent;
       
private AutoResetEvent auto;
       
private bool suspend;
       
private AsyncOperation asyncOperation;

       
public delegate void InvokeDelegate(string str);

       
private InvokeDelegate invokeDelegate;
       
const string str = "Test";
       
private bool formClosed;

       
public Form1()
        {
            InitializeComponent();
            manualResetEvent
= new ManualResetEvent(false);
            auto
= new AutoResetEvent(true);
            asyncOperation
= AsyncOperationManager.CreateOperation(null);
            invokeDelegate
= new InvokeDelegate(this.SafeInvoke);
           
this.FormClosed += delegate
                                   {
                                      
this.formClosed = true;
                                      
this.auto.Close();
                                   };
        }

       
private void btnStart_Click(object sender, EventArgs e)
        {
           
this.btnStart.Enabled = false;
           
this.btnSuspend.Enabled = true;
            ThreadPool.QueueUserWorkItem(
delegate
                                             {
                                                 SafeInvoke();

                                                
//this.BeginInvoke(invokeDelegate, new object[] { str });
                                             });
        }

       
private void btnSuspend_Click(object sender, EventArgs e)
        {
           
this.btnSuspend.Enabled = false;
           
this.btnResume.Enabled = true;
           
this.suspend = true;
            manualResetEvent.Reset();
        }

       
private void SafeInvoke(string s)
        {
           
while (true)
            {
               
if (formClosed)
                   
return;

                Thread.Sleep(
200);

               
if (suspend)
                   
this.auto.WaitOne();
               
this.txtMessageBox.AppendText(s);
            }
        }

       
private void SafeInvoke()
        {
           
while (true)
            {
               
if (formClosed)
                   
return;

                Thread.Sleep(
200);

               
if (suspend)
                   
//this.auto.WaitOne();
                    manualResetEvent.WaitOne();

                asyncOperation.Post(
delegate
                                    {
                                       
this.txtMessageBox.AppendText(str);
                                    }, str);
            }

        }

       
private void btnResume_Click(object sender, EventArgs e)
        {
           
this.btnResume.Enabled = false;
           
this.btnSuspend.Enabled = true;
           
this.suspend = false;
           
//this.auto.Set();
            manualResetEvent.Set();
        }
    }
}

posted on 2009-08-26 23:58  米高佐敦  阅读(1052)  评论(0编辑  收藏  举报