所谓死锁,就是Add在等待Read,同时Read也在等待Add

解决方案 »

  1.   

    凑巧而已,你测试时你的Timer正好没有被垃圾回收试试改成这样,说不定Timer就不会继续跑了:
                var ThrdA = new Thread(FunA);
                ThrdA.Start();
                for (int i = 0; i < 10; i++)
                {
                    var s = new int[100000000];
                }
                Console.ReadLine();
      

  2.   


            public static void Add(object obj)
            {
                var num = new Random().Next(0, 1000);
                try
                {
                    rwl.AcquireWriterLock(TimeSpan.FromSeconds(30));
                    try
                    {
                        numList.Add(num);                    Console.WriteLine("我是线程{0},我插入的数据是{1}。", Thread.CurrentThread.ManagedThreadId, num);
                    }
                    finally
                    {
                        rwl.ReleaseWriterLock(); 
                    }
                }
                catch (ApplicationException)
                {
                    rwl.ReleaseWriterLock();
                }
            }我修改了部分代码(同样修改了Read部分),如果死锁,请求便超时,同时抛出ApplicationException异常,实际上并没有抛出异常。所以,我想应该不是死锁的问题。
      

  3.   

    原因很简单,计时器被GC了。在MSDN里有一段话:只要在使用 Timer,就必须保留对它的引用。 对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。 即使 Timer 仍处在活动状态,也会被回收。http://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.110).aspx
      

  4.   

    是呀,@phommy的评论提醒了我往GC方面想,在@teof的博客上看到上面那句话,豁然开朗!
    而且,回调方法不在创建计时器的线程上执行,而是在系统提供的ThreadPool线程上执行。呵呵