代码:
    class Trans
    {
        public delegate void myDlg(string s);
        public event myDlg myEvent;        private System.Timers.Timer myTimer;        public Trans()
        {
            myTimer =new System.Timers.Timer(3000);
            myTimer.Elapsed +=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
            myTimer.Enabled = true;
        }        private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            myTimer.Enabled = false;            string s = "xxxx";
            System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ReceiveThread),s,0,0);            myTimer.Enabled = true;
        }        private void ReceiveThread(object s)
        {
            if (this.myEvent != null)
                this.myEvent(System.Convert.ToString(s));
        }
    }=========================================================================================    class Manager
    {
        public Manager()
        {
            Trans trans = new Trans();
            trans.myEvent += new Trans.myDlg(trans_myEvent);
        }        private void trans_myEvent(string s)
        {
            Console.WriteLine(s);
        }
    }=========================================================================================    class Program
    {
        static void Main(string[] args)
        {
            Manager m = new Manager();
            Thread.Sleep(10000);
        }
    }=========================================================================================我的理解是,既然new了一个System.Threading.Timer,那它就应该在自己单独的线程中运行,又由于new的时候最后一个参数为0,它不是应该不断运行吗?它应该和myTimer无关吧,为什么它是隔3秒输出一个“xxxx"呢?希望大家帮帮忙啊。

解决方案 »

  1.   

    myTimer =new System.Timers.Timer(3000);
    3秒是这的。
    System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ReceiveThread),s,0,0);
    如果 dueTime 为零 (0),则立即调用 callback。如果 dueTime 为 Timeout.Infinite,则不会调用 callback;计时器将被禁用,但通过调用 Change 方法可以重新启用计时器。如果 period 为零 (0) 或 Infinite,并且 dueTime 不是 Infinite,则只会调用一次 callback;计时器的定期行为将被禁用,但使用 Change 方法可以重新启用该行为。
      

  2.   

    soaringbird(飞翔鸟):
    如果 period 为零 (0) 或 Infinite,并且 dueTime 不是 Infinite,则只会调用一次 callback;计时器的定期行为将被禁用,但使用 Change 方法可以重新启用该行为。====================================
    多谢,我原以为period为0就是不停地调用。另外,我还想知道,主线程sleep10秒后就结束,那System.Threading.Timer对象自己的线程也跟着结束了是吗?还是在执行完ReceiveThread()方法就结束了?还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
      

  3.   

    另外,我还想知道,主线程sleep10秒后就结束,那System.Threading.Timer对象自己的线程也跟着结束了是吗?还是在执行完ReceiveThread()方法就结束了?
    应该是执行完ReceiveThread()后结束,如果这个方法没写好,就可能造成结束不了。还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
    是会这样,但因为没有对它们的引用了,每隔一段时间就会被GC回收。
      

  4.   

    原来如此,多谢soaringbird(飞翔鸟)。虽然对回收机制还不太明白。