11

我正在尝试每秒刷新一次标签内容。所以我定义了两种方法如下。我startStatusBarTimer()在我的构造函数中使用Window.

代码:

private void startStatusBarTimer()
{
    System.Timers.Timer statusTime = new System.Timers.Timer();

    statusTime.Interval = 1000;

    statusTime.Elapsed += new System.Timers.ElapsedEventHandler(statusTimeElapsed);

    statusTime.Enabled = true;
}

private void statusTimeElapsed(object sender, ElapsedEventArgs e)
{
    lblNow.Content = DateTime.Now.ToString("yyyy/MM/dd");      
}

但我得到这个错误:

调用线程无法访问此对象,因为不同的线程拥有它。

怎么了?或者我能做什么?

4

2 回答 2

14

您正面临线程关联性问题。由于调用了 elapsed 事件background thread,因此您无法从后台线程访问 UI 控件。您需要执行操作,UI dispatcher以便将其分派到 UI 线程 -

private void statusTimeElapsed(object sender, ElapsedEventArgs e)
{
    App.Current.Dispatcher.Invoke((Action)delegate
    {
       lblNow.Content = DateTime.Now.ToString("yyyy/MM/dd");   
    });
}

或者

您可以使用DispatcherTimer专门为此目的构建的。您可以从其Tick事件处理程序访问 UI 控件。请参阅MSDN上的示例。

于 2013-09-15T19:30:17.120 回答
3

只需使用以下代码刷新 WPF 应用程序中的任何控件。您必须在同一命名空间中通过此类。

public static class ExtensionMethods
    {
        private static Action EmptyDelegate = delegate() { };

        public static void Refresh(this UIElement uiElement)
        {
            uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
        }
    }

之后使用如下。

lable1.Refresh();
于 2016-01-06T17:49:00.007 回答