← Назад к вопросам
Что такое контекст синхронизации?
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)
Практическое правило
- Используй
ConfigureAwait(false)во всём backend-коде - Не используй
.Resultили.Wait()— это deadlock - Делай всё асинхронным (async all the way)
Основные выводы
- SynchronizationContext — управление контекстом выполнения
- ConfigureAwait(false) избегает восстановления контекста
- Это критично для предотвращения deadlock'ов в ASP.NET
- Backend код должен использовать ConfigureAwait(false)