Поиск…


замечания

Контекст синхронизации - это абстракция, которая позволяет потреблять код для передачи единиц работы планировщику, не требуя понимания того, как будет запланирована работа.

Контексты синхронизации традиционно используются для обеспечения того, чтобы код запускался в определенном потоке. В приложениях 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> автоматически фиксирует контекст синхронизации, на котором он создан.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow