В моем приложении я создаю новый поток пользовательского интерфейса со следующим кодом:
Thread thread = new Thread(() =>
{
MyWindow windowInAnotherThread = new MyWindow();
windowInAnotherThread.Show();
System.Windows.Threading.Dispatcher.Run();
}) { IsBackground = true };
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Это дает мне следующую проблему:
В конструкторе класса MyWindow выполняется BackgroundWorker. В RunWorkerCompleted элемент управления должен быть обновлен некоторыми данными, которые вычисляет BackgroundWorker.
Я построил небольшой образец, который иллюстрирует это:
public partial class MyWindow : Window {
public MyWindow() {
InitializeComponent();
var bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
this.Title = "Calculated title";
}
void bw_DoWork(object sender, DoWorkEventArgs e) {
Thread.Sleep(3000);
}
}
В bw_RunWorkerCompleted()
я получаю InvalidOperationException
(вызывающий поток не может получить доступ к этому объекту, потому что им владеет другой поток). Похоже, что BackgroundWorker не возвращается к правильному потоку пользовательского интерфейса, из которого он был запущен.
Может ли кто-нибудь помочь мне, что я могу сделать, чтобы решить эту проблему? Я не могу изменить код, который выполняет BackgroundWorker, потому что он находится в фреймворке, который я использую. Но я могу сделать что-то еще в RunWorkerCompleted-Event. Но я понятия не имею, как решить эту проблему.