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();
}
}
}
转载于:https://www.cnblogs.com/jordan2009/archive/2009/08/26/1554737.html