Вы должны вернуть модифицирующий код обратно в основной поток, независимо от того, является ли его WPF или Winforms, межпоточный доступ к пользовательскому интерфейсу либо явно запрещенным (обычно), либо категорически не рекомендуется и глючит.
Есть много способов сделать это, в Winforms я обычно использую Control.Invoke
, например:
public void UpdateMyTextBox(string NewText)
{
if(InvokeRequired)
Invoke(new Action<string>(UpdateMyTextBox), NewText);
else
myTextBox.Text = NewText;
}
В этом примере свойство InvokeRequired
проверит, вызывается ли оно в пользовательском интерфейсе.thread, а если нет, мы будем вызывать Invoke
, который поместит запрос в поток пользовательского интерфейса.
В WPF вы наблюдаете за использованием Dispatcher
, и вы делаете это очень похожим образом:
public void UpdateMyWpfTextBox(string NewText)
{
if(!CheckAccess())
Dispatcher.Invoke(new Action<string>(UpdateMyWpfTextBox), NewText);
else
myTextBox.Text = NewText;
}