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