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





Очень часто запрос будет использовать один и тот же поток во всем, но это определенно не всегда так - ASP.NET показывает резкость. Есть старый подробная статья в блоге по этому поводу с 2005 года, но с .NET 4.5 дела обстоят лучше.
Что вы имеете в виду под не-веб-кейсом? Это действительно зависит от того, что вы делаете - если вы знаете, что находитесь в одном потоке, можно использовать ThreadStatic.
Я имею в виду приложение, на которое не влияют абстракции ASP.NET. CallContext и ThreadStatic, похоже, работают одинаково, т.е. у них одинаковое время жизни. Мне интересно узнать разницу между ними.
ThreadStatic явно связан с потоком. Любая другая платформа может решить использовать гибкость потоков так же, как ASP.NET. CallContext - это способ взять с собой некоторый контекст, когда вы это делаете.
Наткнулся сюда и поинтересовался, какова ваша репутация, когда вы ответили на это ... 246.
К сожалению, первая ссылка уже мертва. Кроме того, проблема, описанная в статье за второй ссылкой, кажется, больше не актуальна, начиная с .NET 4.5 (см. blog.stephencleary.com/2013/04/…).
Элементы, хранящиеся как ThreadStatic, доступны более чем для одного запроса. IIS повторно использует поток после завершения запроса для обработки последующих запросов, он даже может переключать запрос из одного потока в другой во время обработки. ASP.Net очищает CallContext после каждого запроса.
Однако это больше, чем это - один запрос может переключаться между потоками, поэтому то, что вы помещаете в ThreadStatic на одной фазе, не будет доступно на другой.
Каков механизм, поддерживающий контекст вызова между потоками, обслуживающими один и тот же запрос?
В основном, обработка гибкости потоков ASP.NET. Я подозреваю, что это ThreadStatic внутри, и когда один поток перестает обрабатывать запрос по какой-либо причине, ASP.NET сохраняет запрос и контекст вместе, а затем сбрасывает его в любом потоке, выполняющем работу.
Хорошо, я узнал, что контекст вызова является абстракцией над статическим хранилищем потока и что платформа ASP.NET явно перемещает данные из одного потока в следующий, обрабатывающий запрос.
@Jon: Верно ли поведение Thread Agility и для WCF? Безопасно ли использовать ThreadStatic в приложении WCF для хранения данных запроса?
Эта ветка spring.net была у меня в голове, когда я спросил (баллы за ссылки). Я особенно искал детали, относящиеся к не-веб-кейсу. По сути, они одинаковы?