Как общий принципал программирования Windows, вы должны совершать вызовы для обновления пользовательского интерфейса из потока пользовательского интерфейса (того, который обрабатывает сообщения через насос сообщений).
В Windows Forms этот способ был реализован посредством реализации интерфейса ISynchronizeInvoke в классе Control , главным образом путем реализации метода Invoke .
С выпуском .NET 2.0 стало понятно, что необходим более совершенный механизм для перенаправления вызовов в правильный контекст. Вот тут и наступает SynchronizationContext .
Этот класс абстрагирует интерфейс, который вы бы использовали для маршалинга вызовов в различных контекстах, что позволяет для конкретных реализаций в зависимости от контекста.
Таким образом, независимо от того, является ли Windows Forms средой или WPF, один вызов может быть выполнен одинаковым образом в этих контекстах с одинаковым эффектом (маршалинг вызова).
В вашем конкретном случае, поскольку вы используете замыкание (анонимный метод), вы можете воспользоваться тем, что вам доступен SynchronizationContext (через статическое Текущее свойство ) на сайте вызова потока, чтобы обеспечить механизм обратного вызова потока пользовательского интерфейса из фонового потока:
// Get the synchronization context.
// This is in the UI thread.
SynchronizationContext sc = SynchronizationContext.Current;
// Create the thread, but use the SynchronizationContext
// in the closure to marshal the call back.
Thread t = new Thread(delegate()
{
// Do your work.
po.Organise(inputPath, outputPath, recursive);
// Call back using the SynchronizationContext.
// Can call the Post method if you don't care
// about waiting for the result.
sc.Send(delegate()
{
// Fill the progress bar.
PBar.Value = 100;
});
});
// Make the progress bar indeterminate.
PBar.IsIndeterminate = true;
// Start the thread.
t.Start();
Обратите внимание: если вас не волнует ожидание результата обратного вызова в потоке пользовательского интерфейса, вы можете вместо этого совершить вызов Post метода , который отправит вызов в пользовательский интерфейс. поток, не дожидаясь завершения этого вызова.