问题:在定时器时间到来的函数里对Lable Content赋值就是说,被另一个线程调用。建了一个WPF程序,定义了一个Timer(using System.Timers;)    public partial class MainWindow : Window
    {
        private Timer   m_Timer;        public int Count { get; set; }
定时器设置:
            m_Timer = new Timer();
            m_Timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            m_Timer.Enabled = false;
            m_Timer.Interval = 1000;调用函数:
        public void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs args)
        {
            Count++;
            this.lblS.Content = Count;
        }this.lblS.Content = Count; 这一句总是会出错!

解决方案 »

  1.   

    试试
    this.lblS.Content = Count.ToString();
      

  2.   

    是“调用线程无法访问此对象,因为另一个线程拥有该对象。”
    “InValidOprationException was unhandled by user code”KissXYL,用ToString也不行~
      

  3.   

    我刚才在测试过一种可能,是不是 在这个函数里面,不能直接调用 lblS这个Lable(这个Lable在Window上的),Timer应该是另起的线程,然后我创建了一个MyTimer(派生于Timer)类,把当前的Window实例,存在MyTimer里面,通过sender取到Timer,然后用Windows.lblS.content来赋值,我发现还是一样的错!不知道是什么原因……
      

  4.   

    //用委托来做
    //定义委托
       private delegate void UpdateLabelContent(string count);
            /// <summary>
            /// 跨线程给label赋值
            /// </summary>
            private void updateLableContent(string count)
            {            if (this.lblS.InvokeRequired)
                    {
                        UpdateLabelContent d = new UpdateLabelContent(updateLableContent);
                        this.BeginInvoke(d, new object[] {count});
                    }
                    else
                    {
                       this.lblS.Content = count;
                    }        
            }//然后赋值的时候就
     public void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs args)
      {
      Count++;
      UpdateLabelContent(Count);
      }
      

  5.   

    sxiaohui 能说清楚一点吗?
    label没有InvokeRequired属性,还有一个问题BeginInvoke也不是Window的函数,不知道怎么加~@@
      

  6.   

    这是wpf的。。 抱歉  我不会wpf哦
    反正他的意思就是 你能在非ui线程里面去给ui线程里面的控件赋值
    在winform里面是我那种方式解决的
    看错题了 抱歉
      

  7.   

    是WPF程序,我直接在WIndow里面加的代码
      

  8.   

    sxiaohui 还是谢了啊!
    还有解决方法吗?
      

  9.   

    this.lblS.Dispatcher.BeginInvoke((Action)delegate{this.lblS.Content = Count.ToString(); }, DispatcherPriority.Normal);
      

  10.   

    KissXYL谢了,我找到另一个Timer类
    在WPF里面可以用 DispatcherTimer m_Timer = new DispatcherTimer(); 
    这个类,就可以直接赋Content ~~
    OYE~结贴~~~
      

  11.   

     Control.CheckForIllegalCrossThreadCalls = false;在load里加上试试,然后你在那里启动Timer?