Arkadeep De Ответов: 2

Ошибка потока в WPF (им владеет другой поток.)


Привет,

Я пытаюсь получить доступ к текстовому полю из другого класса в WPF. Метод был инициирован потоком. И когда я пытаюсь установить значение текстового поля, он получает ошибку

Необработанное исключение типа ' System.InvalidOperationException ' произошло в WindowsBase.dll

Дополнительная информация: вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку.


вызываемый метод:
Thread tScan = new Thread(MyClass.Start);


метод Statusprint вызывается из MyClass.Метод Start (), например,

public static void StatusPrint()
        {
            Instance.txtReport.Text = "value will set here.";
        }


Поскольку я новичок в WPF, поэтому мне нужна ваша помощь, чтобы избавиться от этого.

Что я уже пробовал:

Я пытался поступить именно так.
public static void StatusPrint()
        {
            System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new ThreadStart(() => Instance.txtReport.Text = "value will set here."));
        }


здесь Instance является ли статическая переменная, объявленная в классе MainWindow, инициированной this.
здесь я не получаю никакой ошибки во время выполнения, но она просто не выполняется.

2 Ответов

Рейтинг:
2

Graeme_Grant

Почему? ThreadStart внутри Dispatcher.CurrentDispatcher? Вы не хотите начинать новую нить. Изменить ThreadStart к Action и это должно сработать.


Arkadeep De

попробовал этот с действием. Но получаю эту ошибку..

{Система.Окна.Нарезание резьбы.DispatcherOperation}
диспетчерская система.Окна.Нарезание резьбы.Диспетчер}
Приоритет: Нормальный
Результат: null
Статус: Ожидание
Задача: Id = 85, Status = WaitingForActivation, Method = " {null}", Result = " {еще не вычислено}"

Pete O'Hanlon

Мой 5.

Рейтинг:
1

Pete O'Hanlon

У меня есть метод расширения, который я люблю использовать в этом случае:

public static void BeginInvokeIfRequired(this Dispatcher dispatcher, Action operation)
{
  if (operation== null) return;
  if (dispatcher.CheckAccess())
  {
    action();
  }
  else
  {
    dispatcher.BeginInvoke(action);
  }
}
Чтобы вызвать его, все, что вам нужно сделать, это:
Application.Current.Dispatcher.BeginInvokeIfRequired(()=>Instance.txtReport.Text = "value will set here.");


Graeme_Grant

более аккуратное решение...

Pete O'Hanlon

Спасибо - у меня есть аналогичное решение для диспетчера.Взывать :)

Graeme_Grant

У меня есть что-то похожее, но я быстро исправил заданный вопрос.

Graeme_Grant

мои 5 тоже! :)