CallContext против ThreadStatic

В чем разница между CallContext и ThreadStatic?

Я понял, что в среде ASP.NET данные, хранящиеся в CallContext, могут сохраняться на протяжении всего запроса до его завершения, в то время как ThreadStatic может работать или не работать, поскольку запрос может переключать потоки. Я также узнал, что HttpContext хранится внутри с помощью CallContext.

В обычном приложении они, кажется, сохраняются в течение одного вызова потока. Когда это не так?


Редактировать: В комментариях я узнал, что контекст вызова является абстракцией над статическим хранилищем потока. Платформа ASP.NET явно перемещает данные из одного потока в следующий, который должен обрабатывать один запрос. Другая структура, которая хочет обеспечить гибкость потоков, может сделать то же самое для контекстного хранилища.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
54
0
21 462
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Очень часто запрос будет использовать один и тот же поток во всем, но это определенно не всегда так - ASP.NET показывает резкость. Есть старый подробная статья в блоге по этому поводу с 2005 года, но с .NET 4.5 дела обстоят лучше.

Эта ветка spring.net была у меня в голове, когда я спросил (баллы за ссылки). Я особенно искал детали, относящиеся к не-веб-кейсу. По сути, они одинаковы?

Cristian Libardo 07.11.2008 23:05

Что вы имеете в виду под не-веб-кейсом? Это действительно зависит от того, что вы делаете - если вы знаете, что находитесь в одном потоке, можно использовать ThreadStatic.

Jon Skeet 07.11.2008 23:29

Я имею в виду приложение, на которое не влияют абстракции ASP.NET. CallContext и ThreadStatic, похоже, работают одинаково, т.е. у них одинаковое время жизни. Мне интересно узнать разницу между ними.

Cristian Libardo 08.11.2008 00:07

ThreadStatic явно связан с потоком. Любая другая платформа может решить использовать гибкость потоков так же, как ASP.NET. CallContext - это способ взять с собой некоторый контекст, когда вы это делаете.

Jon Skeet 08.11.2008 00:13

Наткнулся сюда и поинтересовался, какова ваша репутация, когда вы ответили на это ... 246.

user1228 22.02.2017 22:52

К сожалению, первая ссылка уже мертва. Кроме того, проблема, описанная в статье за ​​второй ссылкой, кажется, больше не актуальна, начиная с .NET 4.5 (см. blog.stephencleary.com/2013/04/…).

Zero3 11.06.2019 19:21

Элементы, хранящиеся как ThreadStatic, доступны более чем для одного запроса. IIS повторно использует поток после завершения запроса для обработки последующих запросов, он даже может переключать запрос из одного потока в другой во время обработки. ASP.Net очищает CallContext после каждого запроса.

Однако это больше, чем это - один запрос может переключаться между потоками, поэтому то, что вы помещаете в ThreadStatic на одной фазе, не будет доступно на другой.

Jon Skeet 07.11.2008 22:34

Каков механизм, поддерживающий контекст вызова между потоками, обслуживающими один и тот же запрос?

Cristian Libardo 08.11.2008 00:10

В основном, обработка гибкости потоков ASP.NET. Я подозреваю, что это ThreadStatic внутри, и когда один поток перестает обрабатывать запрос по какой-либо причине, ASP.NET сохраняет запрос и контекст вместе, а затем сбрасывает его в любом потоке, выполняющем работу.

Jon Skeet 08.11.2008 00:14

Хорошо, я узнал, что контекст вызова является абстракцией над статическим хранилищем потока и что платформа ASP.NET явно перемещает данные из одного потока в следующий, обрабатывающий запрос.

Cristian Libardo 08.11.2008 00:38

@Jon: Верно ли поведение Thread Agility и для WCF? Безопасно ли использовать ThreadStatic в приложении WCF для хранения данных запроса?

Amitabh 26.03.2010 19:23

Другие вопросы по теме