none
在线程中调用timer控件,为什么timer控件不能启用 RRS feed

  • 问题

  • NetworkStream ns;
            private void button1_Click(object sender, EventArgs e)
            {
                TcpListener listener = new TcpListener(1314);
                listener.Start();
                TcpClient tclient = listener.AcceptTcpClient();
                ns = tclient.GetStream();
                Thread td = new Thread(new ThreadStart(Fun));
                td.Start();
            }

            private void Fun()
            {
                byte[] bt = new byte[1024];
                while (true)
                {
                    int i = ns.Read(bt, 0, bt.Length);
                    string s = Encoding.UTF8.GetString(bt, 0, i);
                    string[] a = s.Split('-');
                    if (a[0]=="GB")
                    {
                        this.timer1.Enabled = true;
                        MessageBox.Show("禁用成功");
                    }
                }
            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("cmd");
                for (int i = 0; i < p.Length; i++)
                {
                    p[i].Kill();
                }
            }

    此代码是通过不断接收从客户端发过来的命令判断是否启用timer控件,但为什么接收到“GB”还是不能启用timer控件?

    2011年6月3日 12:55

答案

  • 您好,

    根据你的代码你是用的Sytem.Windows.Forms.Timer类的一个实例吧, 该实例适合于单线程的环境。根据你的情况我觉得你使用Sytem.Timers.Timer类更加合适, 该类适合多线程的环境。

    我试过一下代码:

     private void button2_Click(object sender, EventArgs e)
        {
          Thread t = new Thread(new ThreadStart(work));
          t.Start();
        }
    
        private void work()
        {
          System.Timers.Timer timer = new System.Timers.Timer();
          timer.Interval = 500;
          timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
          timer.Enabled = true;
        }
    
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          Console.WriteLine("Test");
        }

    当我把上述代码的timer实例改成Sytem.Windows.Forms.Timer类的一个实例时, 如你所说的就不能工作了. 所以你可以试试把你的timer实例改成Sytem.Timers.Timer类的一个实例。谢谢


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月6日 7:57
  • 您好,

    关于Sytem.Windows.Forms.Timer类和Sytem.Timers.Timer类的区别和用法你可以参考如下链接:

    Sytem.Windows.Forms.Timer : http://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(VS.80).aspx

    Sytem.Timers.Timer类 : http://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx

    在第一个链接中上面写到:

    Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

    所以说Sytem.Windows.Forms.Timer是工作在UI线程上的。 而你的例子并不是, 你把Timer实例工作在了另外一个你自己创建的Thread中而不是UI线程中。这就解释了为什么不能工作的原因。


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月7日 1:43

全部回复

  • 您好,

    根据你的代码你是用的Sytem.Windows.Forms.Timer类的一个实例吧, 该实例适合于单线程的环境。根据你的情况我觉得你使用Sytem.Timers.Timer类更加合适, 该类适合多线程的环境。

    我试过一下代码:

     private void button2_Click(object sender, EventArgs e)
        {
          Thread t = new Thread(new ThreadStart(work));
          t.Start();
        }
    
        private void work()
        {
          System.Timers.Timer timer = new System.Timers.Timer();
          timer.Interval = 500;
          timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
          timer.Enabled = true;
        }
    
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          Console.WriteLine("Test");
        }

    当我把上述代码的timer实例改成Sytem.Windows.Forms.Timer类的一个实例时, 如你所说的就不能工作了. 所以你可以试试把你的timer实例改成Sytem.Timers.Timer类的一个实例。谢谢


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月6日 7:57
  • 嗯,成功了,谢谢!我学线程没多久,timer控件只适合单线程?单线程和多线程该怎么理解?我的代码是属于多线程?在我的代码中按理说timer控件会启用的,怎么会不启用呢?还有Sytem.Windows.Forms.Timer类和Sytem.Timers.Timer类的实例有什么区别?望解答,谢谢…

    2011年6月6日 11:48
  • 您好,

    关于Sytem.Windows.Forms.Timer类和Sytem.Timers.Timer类的区别和用法你可以参考如下链接:

    Sytem.Windows.Forms.Timer : http://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(VS.80).aspx

    Sytem.Timers.Timer类 : http://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx

    在第一个链接中上面写到:

    Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

    所以说Sytem.Windows.Forms.Timer是工作在UI线程上的。 而你的例子并不是, 你把Timer实例工作在了另外一个你自己创建的Thread中而不是UI线程中。这就解释了为什么不能工作的原因。


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月7日 1:43