我们用代码来认识一下下面几类的作用 AutoResetEvent / ManualResetEvent Monitor

我们用代码来认识一下下面几类的作用
AutoResetEvent / ManualResetEvent    Monitor
-----------------------
首先来看看 AutoResetEvent 和 ManualResetEvent

通过最简单的例程来理解线程同步问题_线程class Program
通过最简单的例程来理解线程同步问题_线程_02通过最简单的例程来理解线程同步问题_线程_03    通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05        static AutoResetEvent are = new AutoResetEvent(false);
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05        static void threadProc()
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09        通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05            Thread currentThread = Thread.CurrentThread;
通过最简单的例程来理解线程同步问题_线程_05            for (int i = 0; i < 100; i++)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05               are.WaitOne();
通过最简单的例程来理解线程同步问题_线程_05               Console.WriteLine("Name:{0} : {1}", currentThread.Name, i);
通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_18        }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05        static void Main(string[] args)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09        通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05            Thread t = new Thread(new ThreadStart(threadProc));
通过最简单的例程来理解线程同步问题_线程_05            t.Name = "TestThread1";
通过最简单的例程来理解线程同步问题_线程_05            t.Start();
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            for (int i = 0; i < 500; i++)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                if ((i % 5) == 0)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09                通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                    are.Set();
通过最简单的例程来理解线程同步问题_线程_05                    Thread.Sleep(10);
通过最简单的例程来理解线程同步问题_线程_18                }

通过最简单的例程来理解线程同步问题_线程_05                Console.WriteLine("pulse:{0}", i);
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05                
通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            while (t.IsAlive)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                t.Abort();
通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            Console.ReadLine();
通过最简单的例程来理解线程同步问题_线程_18        }

通过最简单的例程来理解线程同步问题_线程_54    }

通过最简单的例程来理解线程同步问题_线程

 

正和我们想像的一样,在主线程,每打印5个数,子线程被激活
程序一开始,子线程由于 AutoResetEvent 的 WaitOne方法阻塞 , 这个阻塞只有当收到 AutoResetEvent 的Set方法通知时,才进入运行状态, Set方法发出的通知一方面让处于Wait的子线程进入运行状态,另外一方面,他会阻塞当前线程。

 

下面我们来看看 Monitor 如何工作

通过最简单的例程来理解线程同步问题_线程class Program
通过最简单的例程来理解线程同步问题_线程_02通过最简单的例程来理解线程同步问题_线程_03    通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05        static object tLock = new object();
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05        static void threadProc()
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09        通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05            Thread currentThread = Thread.CurrentThread;
通过最简单的例程来理解线程同步问题_线程_05            for (int i = 0; i < 100; i++)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                lock (tLock)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09                通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                    Monitor.Pulse(tLock);
通过最简单的例程来理解线程同步问题_线程_05                    Monitor.Wait(tLock);
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05                    Console.WriteLine("Name:{0} : {1}", currentThread.Name, i);
通过最简单的例程来理解线程同步问题_线程_18                }

通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_18        }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05        static void Main(string[] args)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09        通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05            Thread t = new Thread(new ThreadStart(threadProc));
通过最简单的例程来理解线程同步问题_线程_05            t.Name = "TestThread1";
通过最简单的例程来理解线程同步问题_线程_05            t.Start();
通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            lock (tLock)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                for (int i = 0; i < 500; i++)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09                通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                    if ((i % 5) == 0)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09                    通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                        Monitor.Pulse(tLock);
通过最简单的例程来理解线程同步问题_线程_05                        Monitor.Wait(tLock);
通过最简单的例程来理解线程同步问题_线程_18                    }

通过最简单的例程来理解线程同步问题_线程_05                    Console.WriteLine("pulse:{0}", i); 
通过最简单的例程来理解线程同步问题_线程_18                }

通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            while (t.IsAlive)
通过最简单的例程来理解线程同步问题_线程_08通过最简单的例程来理解线程同步问题_线程_09            通过最简单的例程来理解线程同步问题_线程_04{
通过最简单的例程来理解线程同步问题_线程_05                t.Abort();
通过最简单的例程来理解线程同步问题_线程_18            }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_05            Console.ReadLine();
通过最简单的例程来理解线程同步问题_线程_18        }

通过最简单的例程来理解线程同步问题_线程_05
通过最简单的例程来理解线程同步问题_线程_54    }

通过最简单的例程来理解线程同步问题_线程

 

上面两个程序达到一个目的

在一些时常的线程程序开发中,很多人习惯 Lock(this) ,其实种做法也不是最佳的,在有些情况下会产生的些问题,这里就不讨论了,微软的MSDN建议我们最好Lock一个静态的私有引用类型,建议不用string

希望上面两个小例程能给你解决线程同步问题上带来帮助 通过最简单的例程来理解线程同步问题_线程_122
上文及例程,代表人个学习的观点,非官方权威解释,不尽之处,请斧正