首页 > 代码库 > 对ManualResetEvent和AutoResetEvent的巩固练习
对ManualResetEvent和AutoResetEvent的巩固练习
在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度是异步的操作,所以就涉及到线程同步问题,所以针对这个对ManualResetEvent和AutoResetEvent两个信号量巩固练习一下。
1 class Program 2 { 3 static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false); 4 static void Main(string[] args) 5 { 6 int i = 0; 7 Thread _Thread = new Thread(TestFun); 8 _Thread.Start(); 9 10 _ManualResetEvent.Set();11 //Thread.Sleep(100);12 Console.WriteLine("test1");13 Console.ReadLine();14 }15 16 static void TestFun()17 {18 while (true)19 {20 _ManualResetEvent.WaitOne();21 Console.WriteLine("test");22 Thread.Sleep(100);23 }24 }25 }
当是手动时,信号量为打开状态,会一直打印test
1 class Program 2 { 3 static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false); 4 static void Main(string[] args) 5 { 6 int i = 0; 7 Thread _Thread = new Thread(TestFun); 8 _Thread.Start(); 9 10 _ManualResetEvent.Set();11 //Thread.Sleep(100);12 Console.WriteLine("test1");13 Console.ReadLine();14 }15 16 static void TestFun()17 {18 while (true)19 {20 _ManualResetEvent.WaitOne();21 Console.WriteLine("test");22 Thread.Sleep(100);23 _ManualResetEvent.Reset();24 }25 }26 }
当把信号量重置后,就不会继续打印test了
如果使用AutoResetEvent的话
1 class Program 2 { 3 static AutoResetEvent _AutoResetEvent = new AutoResetEvent(false); 4 static void Main(string[] args) 5 { 6 int i = 0; 7 Thread _Thread = new Thread(TestFun); 8 _Thread.Start(); 9 10 _AutoResetEvent.Set();11 //Thread.Sleep(100);12 Console.WriteLine("test1");13 Console.ReadLine();14 }15 16 static void TestFun()17 {18 while (true)19 {20 _AutoResetEvent.WaitOne();21 Console.WriteLine("test");22 23 }24 }25 }
其实跟ManualResetEvent一个原理,只是Set之后,只执行一次,需要重新再Set,WaitOne处才会继续执行下去
对ManualResetEvent和AutoResetEvent的巩固练习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。