我用application做一个定时出来事件;                 
    Thread th;
    
    private void start()
    {
        
        ThreadStart ths = new ThreadStart(sendemails);
        th = new Thread(ths);
        Thread.Sleep(10000);
        th.Start();
        start();
        
    }//发送邮件
   private void sendemails()
    {
           VIPAllSendEmail sends = new VIPAllSendEmail();
           Monitor.Enter(sends);           if (sends.allSendEmail()) //发送邮件的类
               ;
               
                Monitor.Wait(sends);
                   //Monitor.Exit(sends);
    }  
问题是这样的 Application_Start中调用  start()
  start()  无限循环每隔10面发送一封邮件  如果在发送邮件的  sendemails()
中我不锁定sends邮件发送对象 那讲发送不出去, 每次提示发送超时  我的邮件是用send 发送的   如果我把超时事件改长点就可以发送一 到二封邮件 如果更长就更多 , 如果我对sendemails() 用上锁那就不设置发送超时事件  发送默认事件是100  也可以连续发送了;
    我最不明白的就是  在sendemails()里面我只能 Monitor.Wait(sends);
 才能发送邮件 Monitor.Exit(sends);
就不能发送啦! 求解   ??? 本人对多线程与锁了解有线希望高手 解答以上2个问题;
 1.不加锁发送超时问题;
2. 加锁后为什么Monitor.Wait(sends);能发送 而Monitor.Exit(sends);就不能发送 Monitor.Wait(sends);
释放锁并阻止该线程  那样我无限循环下去不是需要阻止n个这样的进程嘛??? 疑惑
  

解决方案 »

  1.   

    Exit就解锁了,那么其他线程就进来操作了,就有可能出现不同步引发的问题
      

  2.   

    Elapsed 定时事件在 ThreadPool 线程上引发,其实是定时器重入问题。http://archive.cnblogs.com/a/1739641/MSDN注意 
    当 AutoReset 设置为 false 时,Timer 只在第一个 Interval 过后引发一次 Elapsed 事件。若要保持以 Interval 时间间隔引发 Elapsed 事件,请将 AutoReset 设置为 true。
     Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。注意 
    在一个线程调用 Stop 方法或将 Enabled 属性设置为 false 的同时,可在另一个线程上运行事件处理方法。这可能导致在计时器停止之后引发 Elapsed 事件。Stop 方法的示例代码演示了一种避免此争用条件的方法。
     
    http://msdn.microsoft.com/zh-cn/library/system.timers.timer(v=vs.80).aspx
      

  3.   

    你的VIPALLSENDS里面是异步发送吧?