C#中线程同步对象的方法分析

2019-12-26 11:29:54于海丽

另外ManualResetEvent还有一个Reset方法,用来重新阻断调用者执行的,情况就好比你委托了这个小伙子送花给N个MM,而又想准时地给这N个MM打电话的情况一样。
复制代码 using System; 
using System.Threading;
public class TestMain 

private static ManualResetEvent ent = new ManualResetEvent(false);
public static void Main() 

Boy sender = new Boy(ent); 
Thread th = new Thread(new ThreadStart(sender.SendFlower)); 
th.Start();
ent.WaitOne(); //等待工作 
Console.WriteLine("收到了吧,花是我送嘀:)"); 
Console.ReadLine(); 
}
}
public class Boy 

ManualResetEvent ent;
public Boy(ManualResetEvent e) 

ent = e; 
}
public void SendFlower() 

Console.WriteLine("正在送花的途中"); 
for (int i = 0; i < 10; i++) 

Thread.Sleep(200); 
Console.Write(".."); 

Console.WriteLine(" 花已经送到MM手中了,boss");
ent.Set(); //通知阻塞程序 

}
而AutoResetEvent类故名思意,就是在每次Set完之后自动Reset。让执行程序重新进入阻塞状态。
即AutoResetEvent.Set() 相当于 ManualResetEvent.Set() 之后又立即 ManualResetEvent.Reset(),其他的就没有什么不同的了。 
举个送花给N个MM的例子:
复制代码 using System; 
using System.Threading;
public class TestMain 

private static AutoResetEvent ent = new AutoResetEvent(false);
public static void Main() 

Boy sender = new Boy(ent);
for (int i = 0; i < 3; i++) 

Thread th = new Thread(new ThreadStart(sender.SendFlower)); 
th.Start(); 
ent.WaitOne(); //等待工作 
Console.WriteLine("收到了吧,花是我送嘀:) "); 
}
Console.ReadLine(); 
}
}
public class Boy 

AutoResetEvent ent;
public Boy(AutoResetEvent e) 

ent = e; 
}
public void SendFlower() 

Console.WriteLine("正在送花的途中"); 
for (int i = 0; i < 10; i++) 

Thread.Sleep(200); 
Console.Write(".."); 

Console.WriteLine(" 花已经送到MM手中了,boss");
ent.Set(); //通知阻塞程序,这里的效果相当于 ManualResetEvent的Set()方法+Reset()方法 

}