转载的,先这里留个备份
- 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();
- }
- }
- }