← Назад к вопросам

Что такое контекст синхронизации?

3.0 Senior🔥 141 комментариев
#Асинхронность и многопоточность#Основы C# и .NET

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Контекст синхронизации в C#

Синхронизационный контекст (SynchronizationContext) — это механизм, определяющий, на каком потоке выполнится код после await.

Основная идея

Когда ты используешь await, контекст синхронизации определяет где выполнится продолжение:

await SomeAsync();  // На каком потоке выполнится это?

Типы контекстов

Windows Forms/WPF — WindowsFormsSynchronizationContext

  • Код выполнится на UI потоке

ASP.NET — RequestContext

  • Код выполнится в контексте запроса

Console/Library — null

  • Код может выполниться на любом потоке пула

Классический deadlock

private void Button_Click(object sender, EventArgs e)
{
    var data = FetchDataAsync().Result;  // Блокируем UI поток
}

private async Task<string> FetchDataAsync()
{
    // Нужно вернуться на UI поток
    var response = await new HttpClient().GetAsync("http://api.com");
    // Но UI поток заблокирован! DEADLOCK
    return await response.Content.ReadAsStringAsync();
}

Решение: ConfigureAwait(false)

public async Task<User> GetUserAsync(int id)
{
    var user = await _db.Users
        .FirstOrDefaultAsync(u => u.Id == id)
        .ConfigureAwait(false);  // Не восстанавливать контекст
    return user;
}

Когда использовать ConfigureAwait(false)

✅ Всегда в:

  • Backend коде
  • Библиотеках
  • ASP.NET контроллерах

❌ Никогда в:

  • UI коде (WPF, WinForms)

Практическое правило

  1. Используй ConfigureAwait(false) во всём backend-коде
  2. Не используй .Result или .Wait() — это deadlock
  3. Делай всё асинхронным (async all the way)

Основные выводы

  • SynchronizationContext — управление контекстом выполнения
  • ConfigureAwait(false) избегает восстановления контекста
  • Это критично для предотвращения deadlock'ов в ASP.NET
  • Backend код должен использовать ConfigureAwait(false)
Что такое контекст синхронизации? | PrepBro