Хитрость в том, что ваша логика пользовательского интерфейса должна выполняться в потоке пользовательского интерфейса. Существуют методы, которые делают это проще, чем могло бы быть, но их использование может быть сложным. Вот как я это делал в прошлом:
Сначала вы должны объявить делегата, которого вы можете передать методу Dispatcher.Invoke:
private delegate void UIDelegate();
Затем вы можете настроить фоновый рабочий файл и вызвать его метод RunWorkerAsync:
BackgroundWorker loadWorker = new BackgroundWorker();
loadWorker.DoWork += new DoWorkEventHandler(loadWorker_DoWork);
loadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(loadWorker_RunWorkerCompleted);
loadWorker.RunWorkerAsync();
Затем, чтобы обновить элементы пользовательского интерфейса, вы должны вызвать их диспетчер:
private void changeStatusLabel(string status)
{
progressLabel.Dispatcher.Invoke(new UIDelegate(delegate
{
progressLabel.Content = status;
}));
}
Они вырезаны из более крупных методов и, вероятно, могут быть немного оптимизированы. Тем не менее, это даст вам место для начала.