Асинхронность и культура потоков
У меня есть приложение 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 не течет в асинхронных действиях