调用线程无法访问此对象,因为另一个线程拥有它

时间:2011-03-24 17:58:54

标签: c# wpf timer

namespace PizzaSoftware.UI
{
    /// <summary>
    /// Interaction logic for LoginForm.xaml
    /// </summary>
    public partial class LoginForm : Window
    {
        public LoginForm()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Timer timer = new Timer(1000);
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }

        void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lblCurrentTime.Content = DateTime.Now.ToShortTimeString();
        }
    }
}

基本上,我只是想在我的表单上设置一个显示当前时间的标签。我在另一个问题中建议使用Timer。

我收到了标题中的错误。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:17)

嗯,最简单的方法是使用DispatcherTimer - 它将在调度程序线程中触发其Tick事件:

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
timer.IsEnabled = true;
timer.Tick += timer_Elapsed;

或者,您可以使用Dispatcher.Invoke / BeginInvoke在调度程序线程中执行委托......但这会更复杂。如果您需要在每个计时器上执行重要工作,然后只使用结果更新UI,这将是一种更好的方法 - 但由于您在这里根本没有做太多工作,所以在UI中完成所有工作都没关系线程。

答案 1 :(得分:2)

没有意识到这是一个WPF应用程序。你需要掌握Dispatcher,你可以在构造函数中执行:

    private Dispatcher _dispathcer;

    public LoginForm()
    {
        InitializeComponent();
        _dispathcer = Dispathcer.CurrentDispather;
    }



    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _dispathcer.Invoke(new Action( ()=> { lblCurrentTime.Content = DateTime.Now.ToShortTimeString();});
    }