首页 > 代码库 > 对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的巩固练习