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(); } } }