O segmento de chamada não pode acessar esse object porque possui um segmento diferente.WPF

Sempre que eu atualizo um label, recebo este erro: O segmento de chamada não pode acessar esse object porque um segmento diferente o possui. Eu tentei invocar mas falhou. Estou usando o formulário do WPF.

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; } 

Use o método Dispatcher.Invoke .

Executa o delegado especificado de forma síncrona no encadeamento ao qual o Dispatcher está associado.

Além disso

No WPF, apenas o thread que criou um DispatcherObject pode acessar esse object. Por exemplo, um thread em segundo plano que é desmembrado do segmento principal da interface do usuário não pode atualizar o conteúdo de um botão que foi criado no thread da interface do usuário . Para que o encadeamento em segundo plano acesse a propriedade Content do Button, o encadeamento em segundo plano deve delegar o trabalho para o Dispatcher associado ao encadeamento da interface do usuário. Isso é feito usando Invoke ou BeginInvoke. Invoke é síncrono e BeginInvoke é asynchronous. A operação é incluída na fila de events do Dispatcher no DispatcherPriority especificado.

Você está recebendo o erro porque seu label é criado no thread da interface do usuário e você está tentando modificar seu conteúdo por meio de outro thread. É aqui que você precisaria de Dispatcher.Invoke.

Confira este artigo Threads do WPF Crie aplicativos mais responsivos com o Dispatcher

Você pode usar o Dispatcher para isso. Seu código se torna …

 private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => { try { label1.Content = "df"; } catch { lostfocs ld = new lostfocs(up); // ld.Invoke("df"); object obj=new object(); ld.Invoke("sdaf"); } } )); 

use Dispatcher.Invoke

Exemplo

  void modi() { if(!Dispatcher.CheckAccess()) { Dispatcher.Invoke( ()=>label1.Content = "df",DispatcherPriority.Normal); } else { label1.Content = "df"; } } 

Eu comecei um segmento não-interface do usuário e dentro deste segmento eu olhei um segmento de interface do usuário também. Portanto, minha exigência é como executar um thread de interface do usuário em um thread não-UI. Ao lidar com esse cenário, recebi a seguinte exceção. “Exceção: O segmento de chamada não pode acessar este object porque um segmento diferente é proprietário dele.”

Nesse caso, usei o método Dispatcher.Invoke do elemento da interface do usuário da seguinte maneira e funcionou bem.

 if (m_contextWindow == null) { System.Threading.Thread newWindowThread = new System.Threading.Thread(new ThreadStart( () => { // Create and show the Window m_contextWindow = new ContextWindow(); m_contextWindow.DataContext = this; m_contextWindow.Show(); // Start the Dispatcher Processing System.Windows.Threading.Dispatcher.Run(); })); // Set the apartment state newWindowThread.SetApartmentState(ApartmentState.STA); // Make the thread a background thread newWindowThread.IsBackground = true; // Start the thread newWindowThread.Start(); } else { this.m_contextWindow.Dispatcher.Invoke(new ThreadStart(() => { m_contextWindow.DataContext = this; if (m_contextWindow.Visibility == System.Windows.Visibility.Collapsed || m_contextWindow.Visibility == System.Windows.Visibility.Hidden) m_contextWindow.Visibility = System.Windows.Visibility.Visible; })); } 
 private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => { try { label1.Content = "df"; } catch { lostfocs ld = new lostfocs(up); object obj = new object(); ld.Invoke("sdaf"); } })); } 

Várias sugestões para usar o BeginInvoke, mas nenhuma menção ao EndInvoke. Boa Prática é que ‘todo BeginInvoke tem um EndInvoke correspondente’ e certamente precisa haver alguma salvaguarda contra condições de corrida (Pense: o que acontece com vários BeginInvoke de código, mas nenhum já terminou o processamento?)

É fácil esquecer, e eu vi esse erro (e, sim, é um erro) em ambos os exemplos do MSDN e livros publicados no WinForms