我做了一个棋类游戏,想要分别对玩家和电脑计时,可是这里出现了错误,希望高手指教. private System.Timers.Timer timerComputer = new System.Timers.Timer();
 timerComputer.Elapsed += new ElapsedEventHandler(OnTimer);
            timerComputer.Interval = 1; timer1.Enabled = false;
 
 MouseDown()
{
                    timerPerson.EnableD=false;
                    timerComputer.Enabled = true;                    
                    gm.ComputerPutChess();                  
                    timerComputer.Enabled = false;
                    timer1.Enabled = true;
} public void OnTimer(Object source, ElapsedEventArgs e)
        {
            time2 = time2 + 1;            
            labelTime.Text = time2.ToString();
        }  我想让他在窗体的label控件上显示时,出错:
 线程间操作无效: 从不是创建控件“labelTime”的线程访问它。
 请问大家如何解决!

解决方案 »

  1.   


     public void OnTimer(Object source, ElapsedEventArgs e)
            {
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
                time2 = time2 + 1;            
                labelTime.Text = time2.ToString();
            }
      

  2.   

    TIMER就是一个线程,只是被封装起来了OnTimer其实就是线程的回调函数你要在OnTimer里面改FORM的值,必须使用INVOKE
      

  3.   

    public void OnTimer(Object source, ElapsedEventArgs e)
            {
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
                time2 = time2 + 1;            
                labelTime.Text = time2.ToString();
            }
    这样改他不会动态的显示,就只是在棋下完后显示一个数字
      

  4.   

    TIMER就是一个线程,只是被封装起来了OnTimer其实就是线程的回调函数你要在OnTimer里面改FORM的值,必须使用INVOKE请问这个应该怎样来写呢,改写FORM的值是什么意思啊,INVOKE怎么调用呢
      

  5.   

    public void OnTimer(Object source, ElapsedEventArgs e)
            {
                Invoke(new EventHandle(TimerAction), source, e);
            }public void TimerAction(Object source, EventArgs e)
            {
                time2 = time2 + 1;            
                labelTime.Text = time2.ToString();
            }
      

  6.   

    在.net中几个Timer,但是在Windows应用程序中你应该使用System.Windows.Forms.Timer,而不是其它的Timer。
    如果你确实不想使用Forms.Timer,那么你应该改一下你的代码,参照下面:
    private void button1_Click(object sender, EventArgs e)
    {
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    }private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
    if (this.InvokeRequired)
    {
    try
    {
    ElapsedEventHandler OnTick = new ElapsedEventHandler(this.timer_Elapsed);
    this.Invoke(OnTick, new object[] { sender, e });
    }
    catch
    { }
    return;
    }
    this.label1.Text = DateTime.Now.ToString();
    }
      

  7.   

    greenery(greenery)说的很好啊 就用这个样的委托就可以了
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;这个方式不建议,有的时候跨线程的时候有异常