如何使用抛出InvalidOperationException的计时器更改标签内容

时间:2010-04-26 07:02:16

标签: c# .net wpf multithreading timer

我正在创建一个应用程序,我在该应用程序中使用计时器来更改WPF C#.NET中的标签内容。

在计时器已用完的事件中,我正在编写以下代码

lblTimer.Content = "hello";

但它抛出一个InvalidOperationException并给出一条消息调用线程无法访问此对象,因为另一个线程拥有它。

我正在使用.NET framework 3.5和WPF与C#。

请帮帮我 提前谢谢。

3 个答案:

答案 0 :(得分:11)

对于.NET 4.0,使用DispatcherTimer要简单得多。然后,事件处理程序在UI线程中,它可以直接设置控件的属性。

private DispatcherTimer updateTimer;

private void initTimer
{
     updateTimer = new DispatcherTimer(DispatcherPriority.SystemIdle); 
     updateTimer.Tick += new EventHandler(OnUpdateTimerTick);
     updateTimer.Interval = TimeSpan.FromMilliseconds(1000);
     updateTimer.Start();
}

private void OnUpdateTimerTick(object sender, EventArgs e)
{
    lblTimer.Content = "hello";
}

答案 1 :(得分:3)

lblTimer在您的主要GUI线程中声明,并且您正尝试从其他线程更新它 - >你得到这个错误。

link “在非UI线程上访问WPF控件”包含问题的说明及其修复。

答案 2 :(得分:1)

InvokeRequired在wpf中不起作用。

更新另一个线程拥有的GUI元素的正确方法是:

在模块级别声明:

delegate void updateLabelCallback(string tekst);

这是更新标签的方法:

private void UpdateLabel(string tekst)
    {
        if (label.Dispatcher.CheckAccess() == false)
        {
            updateLabelCallback uCallBack = new updateLabelCallback(UpdateLabel);
            this.Dispatcher.Invoke(uCallBack, tekst);
        }
        else
        { 
    //update your label here
        }
     }