ManualResetEvent使用演示
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
public class EventClient : Form
{
private Button CreateThreas;
private ManualResetEvent m_Event1;
private Button Signal;
private Button Reset;
public EventClient()
{
InitializeComponent();
m_Event1 = new ManualResetEvent(false);
}
private void InitializeComponent()
{
//
}
[STAThread]
static void Main()
{
Application.Run(new EventClient());
}
// 创建线程
private void OnCreateThreads(object sender,EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Start);
Thread thread1 = new Thread(threadStart);
thread1.Start();
Thread thread2 = new Thread(threadStart);
thread2.Start();
}
// 线程执行体
protected void Start()
{
// 阻塞当前线程线程
m_Event1.WaitOne();
int threadID = Thread.CurrentThread.GetHashCode();
string caption = "Thread ID = " + threadID;
MessageBox.Show("Stopped Waiting",caption);
}
private void OnSignal(object sender,EventArgs e)
{
// 通知被m_Event1阻塞的线程继续执行
// 这里是thread1, thread2
m_Event1.Set();
}
private void OnReset(object sender,EventArgs e)
{
m_Event1.Reset();
}
}
{
private Button CreateThreas;
private ManualResetEvent m_Event1;
private Button Signal;
private Button Reset;
public EventClient()
{
InitializeComponent();
m_Event1 = new ManualResetEvent(false);
}
private void InitializeComponent()
{
//
}
[STAThread]
static void Main()
{
Application.Run(new EventClient());
}
// 创建线程
private void OnCreateThreads(object sender,EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Start);
Thread thread1 = new Thread(threadStart);
thread1.Start();
Thread thread2 = new Thread(threadStart);
thread2.Start();
}
// 线程执行体
protected void Start()
{
// 阻塞当前线程线程
m_Event1.WaitOne();
int threadID = Thread.CurrentThread.GetHashCode();
string caption = "Thread ID = " + threadID;
MessageBox.Show("Stopped Waiting",caption);
}
private void OnSignal(object sender,EventArgs e)
{
// 通知被m_Event1阻塞的线程继续执行
// 这里是thread1, thread2
m_Event1.Set();
}
private void OnReset(object sender,EventArgs e)
{
m_Event1.Reset();
}
}