using Sy
stem;
using Sy
stem.Collection
s.Generi
c;
using Sy
stem.Linq;
using Sy
stem.Net;
using Sy
stem.Windows;
using Sy
stem.Window
s.Controls;
using Sy
stem.Window
s.Documents;
using Sy
stem.Window
s.Input;
using Sy
stem.Window
s.Media;
using Sy
stem.Window
s.Media.Animation;
using Sy
stem.Window
s.Shapes;
namespace Silverlight20.Thread
{
public partial
class EventWaitHandle : UserControl
{
// AutoResetEvent(bool statE) - 通知其他线程是否可入的类,自动 Reset()
// bool state - 是否为终止状态,即是否禁止其他线程入内
private Sy
stem.Threading.AutoResetEvent autoResetEvent =
new Sy
stem.Threading.AutoResetEvent(
false);
// ManualResetEvent(bool statE) - 通知其他线程是否可入的类,手动 Reset()
// bool state - 是否为终止状态,即是否禁止其他线程入内
private Sy
stem.Threading.ManualResetEvent manualResetEvent =
new Sy
stem.Threading.ManualResetEvent(
false);
private
static
int i;
public EventWaitHandle()
{
initializeComponent(
);
// 演示 AutoResetEvent
AutoResetEventDemo(
);
// 演示 ManualResetEvent
ManualResetEventDemo(
);
}
private
void AutoResetEventDemo()
{
i = 0;
for (
int x = 0; x < 100; x++)
{
// 开 100 个线程去操作静态变量 i
Sy
stem.Threading.Thread thread =
new Sy
stem.Threading.Thread(
new Sy
stem.Threading.ThreadStart(AutoResetEventDemoCall
BACk)
);
thread.Start(
);
// 阻塞当前线程,直到 AutoResetEvent 发出 Set() 信号
autoResetEvent.WaitOne(
);
}
Sy
stem.Threading.Thread.Sleep(1000
);
// 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果
txtAutoResetEvent.Text = i.To
String(
);
}
private
void AutoResetEventDemoCall
BACk()
{
try
{
int j = i + 1;
// 模拟多线程并发操作静态变量 i 的情况
Sy
stem.Threading.Thread.Sleep(5
);
i =
j;
}
finally
{
// 发出 Set() 信号,以释放 AutoResetEvent 所阻塞的线程
autoResetEvent.Set(
);
}
}
private
void ManualResetEventDemo()
{
i = 0;
for (
int x = 0; x < 100; x++)
{
// Reset() - 将 ManualResetEvent 变为非终止状态,即由此线程控制 ManualResetEvent,
// 其他线程排队,直到 ManualResetEvent 发出 Set() 信号(AutoResetEvent 在 Set() 时会自动 Reset())
manualResetEvent.Reset(
);
// 开 100 个线程去操作静态变量 i
Sy
stem.Threading.Thread thread =
new Sy
stem.Threading.Thread(
new Sy
stem.Threading.ThreadStart(ManualResetEventDemoCall
BACk)
);
thread.Start(
);
// 阻塞当前线程,直到 ManualResetEvent 发出 Set() 信号
manualResetEvent.WaitOne(
);
}
Sy
stem.Threading.Thread.Sleep(1000
);
// 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果
txtManualResetEvent.Text = i.To
String(
);
}
private
void ManualResetEventDemoCall
BACk()
{
try
{
int j = i + 1;
// 模拟多线程并发操作静态变量 i 的情况
Sy
stem.Threading.Thread.Sleep(5
);
i =
j;
}
finally
{
// 发出 Set() 信号,以释放 ManualResetEvent 所阻塞的线程,同时 ManualResetEvent 变为终止状态)
manualResetEvent.Set(
);
}
}
}
}