ManualResetEvent类
#作用
一个线程通知其他一个或多个线程正在发送的事件。
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
参数表示调用WaitOne()方法的线程是继续执行(true)还是阻塞(false)。
WaitOne():调用WaitOne()方法的线程会阻塞,等待主控线程的manualResetEvent.Set()信号。
Set():将事件状态设为true,调用WaitOne()的线程继续执行。
Reset():将事件状态设为false,调用WaitOne()的线程阻塞。
Set() Reset():只针对WaitOne()方法,不影响WaitOne()方法之前的程序执行。若没有信号,调用WaitOne()方法的线程一直阻塞。
1.事件初始状态设为false,task线程在第一个WaitOne()处阻塞。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ManualResetEvent测试
{
class Program
{
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
//Task线程和主线程同时执行
Task task = Task.Factory.StartNew(() =>
{
GetDataFromServer(1);
});
Console.ReadLine();
}
static void GetDataFromServer(int serverNumber)
{
Console.WriteLine("I get first data from server" + serverNumber);
manualResetEvent.WaitOne();
Console.WriteLine("I get second data from server" + serverNumber);
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("I get third data from server" + serverNumber);
manualResetEvent.WaitOne();
Console.WriteLine("All the data collected from server" + serverNumber);
}