The calling thread cannot access this object because a different thread owns it

前端 未结 2 370
北恋
北恋 2021-01-18 17:32
namespace PizzaSoftware.UI
{
    /// 
    /// Interaction logic for LoginForm.xaml
    /// 
    public partial class LoginForm : Windo         


        
相关标签:
2条回答
  • 2021-01-18 18:16

    Well, the simplest approach is to use a DispatcherTimer - which will fire its Tick event in the dispatcher thread:

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

    Alternatively, you can use Dispatcher.Invoke/BeginInvoke to execute a delegate in the dispatcher thread... but that will be more complicated. This would be a better approach if you needed to do significant work on each timer tick and then just update the UI with the result - but as you're not doing much work at all here, it's fine to just do it all in the UI thread.

    0 讨论(0)
  • 2021-01-18 18:22

    Didn't realize this was a WPF app. You need to get a hold of the Dispatcher, which you can do in the Constructor:

        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();});
        }
    
    0 讨论(0)
提交回复
热议问题