Асинхронность и культура потоков

У меня есть приложение MVC, где я переопределяю мой метод базового контроллера OnActionExecuting() для установки моей культуры потоков:

protected override void OnActionExecuting(ActionExecutingContext filterContext) {
    var langCode = GetLangCode();
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode);
    Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode);
}

Поскольку я начал асинхронно программировать больше, мне интересно, как сохраняется культура, если мы вернем поток, чью культуру мы изменили в пул потоков, и новый поток отправлен, когда задача async завершена? Любые ошибки, о которых я должен знать?

Ответ 1

Основной способ может использовать шаблон await task.ConfigureAwait(false), который часто неправильно используется как легкое (но неправильное) средство против тупиков. Таким образом, продолжение будет происходить в потоке пула без контекста синхронизации. В этом случае CurrentCulture не будет течь, потому что он не течет как часть ExecutionContext. Хуже того, вы можете использовать Task.Run(lambda) (что обычно не должно быть в приложении ASP.NET). Код внутри lambda не будет иметь правильного CurrentCulture.

В противном случае AspNetSynchronizationContext будет корректно перемещаться CurrentCulture через await продолжения, даже если они происходят в разных потоках.

Ответ 2

Короче говоря, да, ASP.NET настроен таким образом, чтобы поток через ваши асинхронные операции использовался как SynchronizationContext. Вы можете немного прочитать о том, как это работает в MSDN: https://msdn.microsoft.com/en-us/magazine/gg598924.aspx

Есть некоторые ошибки, связанные с идентификацией, которую вы можете прочитать по этому вопросу SO: Используя ASP.NET Web API, мой ExecutionContext не течет в асинхронных действиях