.NET Framework
Контексты синхронизации
Поиск…
замечания
Контекст синхронизации - это абстракция, которая позволяет потреблять код для передачи единиц работы планировщику, не требуя понимания того, как будет запланирована работа.
Контексты синхронизации традиционно используются для обеспечения того, чтобы код запускался в определенном потоке. В приложениях WPF и Winforms структура представления SynchronizationContext
представляющая поток пользовательского интерфейса, предоставляется каркасом представления. Таким образом, SynchronizationContext
можно рассматривать как шаблон-производитель-потребитель для делегатов. Рабочий поток создает исполняемый код (делегат) и ставит его в очередь или потребляет контур сообщения пользовательского интерфейса.
Параллельная библиотека задач предоставляет функции автоматического захвата и использования контекстов синхронизации.
Выполнить код в потоке пользовательского интерфейса после выполнения фоновой работы
В этом примере показано, как обновить компонент пользовательского интерфейса из фонового потока с помощью SynchronizationContext
void Button_Click(object sender, EventArgs args)
{
SynchronizationContext context = SynchronizationContext.Current;
Task.Run(() =>
{
for(int i = 0; i < 10; i++)
{
Thread.Sleep(500); //simulate work being done
context.Post(ShowProgress, "Work complete on item " + i);
}
}
}
void UpdateCallback(object state)
{
// UI can be safely updated as this method is only called from the UI thread
this.MyTextBox.Text = state as string;
}
В этом примере, если вы попытались напрямую обновить MyTextBox.Text
внутри цикла for
, вы получите ошибку потоковой MyTextBox.Text
. UpdateCallback
действие UpdateCallback
в SynchronizationContext
, текстовое поле обновляется в том же потоке, что и в остальном пользовательском интерфейсе.
На практике обновления прогресса должны выполняться с использованием экземпляра System.IProgress<T>
. Реализация по умолчанию System.Progress<T>
автоматически фиксирует контекст синхронизации, на котором он создан.