我在windows服务中调用System.Timers.Timer每隔一段时间执行一段代码。现在的问题是在执行这段代码的时候windows服务还是会触发Timer的Elapsed事件,如何让在执行Elapsed事件里的代码的时候不让外面的线程再运行?

解决方案 »

  1.   

    让外面的线程与触发Timer的Elapsed事件同步就行了
      

  2.   

    好辦,在Elapsed中寫
    Timer.Stop();
    //your work
    Timer.Start();
      

  3.   

    Thread myThread = new Thread(new ThreadStart(threadProc));myThread.Start();myThread.Join();我在Elapsed事件中这么写,不知道可不可以把主进程阻止掉?
      

  4.   

    没太明白,你是在Timer的Elapsed事件中启动一个线程?
      

  5.   

    不行,这样只是在线程结束时完成此次的Elapsed事件,并不能使Elapsed事件不再次被触发,Elapsed事件是到时间就触发,并不是等到上一次的事件完成后再触发,每次被触发都是在一个新的线程中执行,与上一次的触发之间没有任何关系。
      

  6.   

    try..可以这样,用个互斥量..
    private Mutex mx=new Mutext();
    timer的Elapsed事件下:
    mx.WaitOne();
    Thread myThread = new Thread(new ThreadStart(threadProc));
    myThread.Start();
    myThread.Join();
    mx.ReleaseMutex();
      

  7.   

    当然用timer.Stop()和timer.Start()也是可以的..只不过效果有点不一样..
      

  8.   

    使用timer.Stop和Start方法:public static System.Timers.Timer timer = new System.Timers.Timer();
            public static Mutex mx = new Mutex();        static void Main(string[] args)
            {
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Interval = 3000;
                timer.Start();
                Console.ReadLine();
            }        static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                timer.Stop();
                //mx.WaitOne();
                Debug.WriteLine(System.DateTime.Now.ToString() + ":" + System.DateTime.Now.Millisecond);
                System.Threading.Thread.Sleep(1000);
                //mx.ReleaseMutex();
                timer.Start();
            }输出如下:
    2007-1-9 12:37:35:515
    2007-1-9 12:37:40:390
    2007-1-9 12:37:44:406
    2007-1-9 12:37:48:406
    2007-1-9 12:37:52:421
    2007-1-9 12:37:56:437
    2007-1-9 12:38:00:437
    2007-1-9 12:38:04:468
    2007-1-9 12:38:08:468
    2007-1-9 12:38:12:484
    2007-1-9 12:38:16:500
    2007-1-9 12:38:20:500
    2007-1-9 12:38:24:500
    2007-1-9 12:38:28:500
    2007-1-9 12:38:32:500
    2007-1-9 12:38:36:562
    2007-1-9 12:38:40:750
      

  9.   

    使用Mutext:public static System.Timers.Timer timer = new System.Timers.Timer();
            public static Mutex mx = new Mutex();        static void Main(string[] args)
            {
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Interval = 3000;
                timer.Start();
                Console.ReadLine();
            }        static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                //timer.Stop();
                mx.WaitOne();
                Debug.WriteLine(System.DateTime.Now.ToString() + ":" + System.DateTime.Now.Millisecond);
                System.Threading.Thread.Sleep(1000);
                mx.ReleaseMutex();
                //timer.Start();
            }输出:
    2007-1-9 12:39:22:375
    2007-1-9 12:39:25:468
    2007-1-9 12:39:28:531
    2007-1-9 12:39:31:531
    2007-1-9 12:39:34:546
    2007-1-9 12:39:37:546
    2007-1-9 12:39:40:546
    2007-1-9 12:39:43:546
    2007-1-9 12:39:46:546
    2007-1-9 12:39:49:546
    2007-1-9 12:39:52:546
    2007-1-9 12:39:55:546
    2007-1-9 12:39:58:546
    2007-1-9 12:40:01:546
    2007-1-9 12:40:04:546
    2007-1-9 12:40:07:562
    2007-1-9 12:40:10:562