Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The calling thread cannot access this object because a different thread owns it.WPF [duplicate]

Tags:

Whenever I refresh a label, I got this error: The calling thread cannot access this object because a different thread owns it. I tried to invoke but it's failed. I'm using WPF Form.

delegate void lostfocs(string st);    private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)     {          Thread t = new Thread(modi);         t.Start();     }  void modi()     {         try         {             label1.Content = "df";         }         catch         {             lostfocs ld = new lostfocs(up);           //  ld.Invoke("df");             object obj=new object();             ld.Invoke("sdaf");         }     } void up(string st)     {         label1.Content = st;     } 
like image 613
Yasser Avatar asked May 29 '12 08:05

Yasser


1 Answers

Use Dispatcher.Invoke Method.

Executes the specified delegate synchronously on the thread the Dispatcher is associated with.

Also

In WPF, only the thread that created a DispatcherObject may access that object. For example, a background thread that is spun off from the main UI thread cannot update the contents of a Button that was created on the UI thread. In order for the background thread to access the Content property of the Button, the background thread must delegate the work to the Dispatcher associated with the UI thread. This is accomplished by using either Invoke or BeginInvoke. Invoke is synchronous and BeginInvoke is asynchronous. The operation is added to the event queue of the Dispatcher at the specified DispatcherPriority.

You are getting the error because your label is created on UI thread and you are trying to modify its content via another thread. This is where you would require Dispatcher.Invoke.

Check out this article WPF Threads Build More Responsive Apps With The Dispatcher

like image 188
Habib Avatar answered Sep 22 '22 05:09

Habib