Вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream. WPF

Всякий раз, когда я обновляю метку, я получаю эту ошибку: вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream. Я пытался вызвать, но это провалилось. Я использую форму 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; } 

Используйте метод Dispatcher.Invoke .

Выполняет указанный делегат синхронно в streamе, с которым связан диспетчер.

Также

В WPF только stream, создавший DispatcherObject, может получить доступ к этому объекту. Например, фоновый stream, выделенный из основного streamа пользовательского интерфейса, не может обновлять содержимое кнопки, созданной в streamе пользовательского интерфейса . Чтобы фоновый stream мог получить доступ к свойству Content Button, фоновый stream должен делегировать работу диспетчеру, связанному с streamом пользовательского интерфейса. Это достигается с помощью Invoke или BeginInvoke. Invoke является синхронным, а BeginInvoke является асинхронным. Операция добавляется в очередь событий Диспетчера в указанном DispatcherPriority.

Вы получаете ошибку, потому что ваш ярлык создан в streamе пользовательского интерфейса, и вы пытаетесь изменить его содержимое через другой stream. Здесь вам потребуется Dispatcher.Invoke.

Ознакомьтесь с этой статьей. Потоки WPF создают более адаптивные приложения с диспетчером

Вы можете использовать Dispatcher для этого. Ваш код будет …

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

использовать Dispatcher.Invoke

пример

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

Я начал один не-UI-stream, и в этом streamе я тоже смотрел один stream пользовательского интерфейса. Поэтому мое требование подобно запуску streamа пользовательского интерфейса в streamе, отличном от UI. При обработке этого сценария я получил следующее исключение. «Исключение: вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream».

В этом случае я использовал метод Dispatcher.Invoke элемента пользовательского интерфейса следующим образом, и он работал хорошо.

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

Несколько советов по использованию BeginInvoke, но не упоминание EndInvoke. Хорошая практика заключается в том, что «у каждого BeginInvoke есть соответствующий EndInvoke», и, конечно же, должна быть какая-то защита от условий гонки (подумайте: что происходит с несколькими BeginInvoke кода, но пока не закончили обработку?)

Легко забыть, и я видел эту ошибку (и, да, это ошибка) как в примерах MSDN, так и в опубликованных книгах по WinForms

  • Как распространять исключения между streamами?
  • Как создать streamи в nodejs
  • Измените элементы управления WPF из не основного streamа с помощью Dispatcher.Invoke
  • Блокируется ли заблокированный объект, если в нем возникает исключение?
  • Является ли инициализация статической членской переменной C ++ streamобезопасной?
  • Что такое семафор?
  • Android: RunOnUiThread против AsyncTask
  • У вас есть набор задач с одновременным запуском X
  • Избегайте синхронизации (это) в Java?
  • stream с несколькими параметрами
  • понимание pthread_cond_wait () и pthread_cond_signal ()
  • Давайте будем гением компьютера.