Как HttpContext.Current работает в многопоточной среде?
Итак, мне осталось интересно, как именно asp.net может обладать статическим свойством, когда (насколько мне известно) asp.net является многопоточным.
- Одна из теорий гласит, что ребята ASP.NET поддерживают разные приложения для каждого запроса... но это не представляется возможным.
- Другая теория гласит, что метод .Current рассматривает текущий поток, а затем использует это для поиска http-контекста в некоторой хэш-таблице (или другом статическом хранилище).
В любом случае, это метод, который кажется действительно полезным... Я бы хотел его использовать, но определенно не хочу отлаживать ошибки общего состояния: -/
Ответы
Ответ 1
То, что говорит Марк, является самым легким, наиболее вероятно, за то, что вам нужно, однако ASP.NET на самом деле несколько сложнее, чем то, что говорит ThreadStatic, поскольку отдельные запросы на самом деле могут обрабатываться несколькими потоками. То, что я считаю, происходит с ASP.NET заключается в том, что исполнительный поток явно используется для переключения контекста, конечно, среда хостинга предназначена для планирования потоков, и в нем есть контекст, который должен выполнять HTTP-контекст, поэтому он находит поток, сообщает потоку, в каком контексте он должен работать. затем отправляет его на своем пути.
Таким образом, решение действительно не так уж печально, где, поскольку threadstatic намного проще и, вероятно, подходит, требуется 95% времени.
Ответ 2
Это не AppDomain
за запрос. Если вы хотите использовать зависящее от потока состояние, попробуйте:
[ThreadStatic]
private static int foo;
public static int Foo {get {return foo;} set {foo = value;}}
Каждый поток теперь получает свое собственное значение Foo
(или скорее: 'foo').
Это не следует использовать легко - у него действительно есть затраты, но является допустимым способом совместного использования состояния по каждому потоку. Я использовал это один раз, может быть, дважды, и я написал много С#. Не переусердствуйте...
В частности, следите за проблемами инициализации (например, забывайте это делать), и не забудьте очистить себя и т.д. И будьте осторожны, если вы используете какой-либо асинхронный код, так как любые обратные вызовы/рабочие/etc будут иметь другое состояние.