В Concurrency in C# Cookbook есть утверждение о AsyncLocal:
Вы должны хранить неизменяемые данные только в AsyncLocal.
В то же время я смотрю на реализацию HttpContextAccessor и вижу, что она реализована на основе AsyncLocal. В приложении ASP.NET Core я могу изменить HttpContext, полученное от HttpContextAccessor (например, я могу поместить некоторые данные в HttpContext.Items или добавить собственный заголовок в HttpContext.Response.Headers).
В чем проблема с модификацией объекта, хранящегося в AsyncLocal? И почему это нормально в HttpContextAccessor случае?





Насколько я понимаю, суть в том, что к AsyncLocal можно обращаться из разных потоков (пример вы можете найти в этом ответе).
И рекомендация использовать неизменяемые данные является распространенным рекомендуемым способом для таких случаев.
Правильно,
HttpContextне предполагается использовать параллельно (т.е. это не потокобезопасно), но, следовательно, можно использовать его в асинхронном потоке.