Как HttpContext.Current работает в многопоточной среде? - PullRequest
12 голосов
/ 13 октября 2009

Так что мне интересно, как именно asp.net может использовать статическое свойство, когда (насколько я знаю) asp.net является многопоточным.

  • Одна теория гласит, что ребята из ASP.NET поддерживают разные домены приложений для каждого запроса ... но это не представляется возможным.
  • Другая теория гласит, что метод .Current просматривает текущий поток, а затем использует его для поиска контекста http в некоторой хеш-таблице (или другом статическом механизме хранения).

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

Ответы [ 2 ]

15 голосов
/ 13 октября 2009

Это не AppDomain за запрос. Если вы хотите использовать специфичное для потока состояние, попробуйте:

[ThreadStatic]
private static int foo;
public static int Foo {get {return foo;} set {foo = value;}}

Каждый поток теперь получает свое собственное значение Foo (точнее: 'foo').

Это , а не для легкого использования - оно имеет свои затраты, но является допустимым способом совместного использования состояния для каждого потока. Я использовал это один раз, может быть, дважды - и я написал много на C #. Не переусердствуйте ...

В частности, следите за проблемами инициализации (т. Е. Забывайте делать это), и не забывайте убирать за собой и т.д. / etc будет иметь другое состояние.

8 голосов
/ 13 октября 2009

То, что говорит Марк, наиболее просто для вас, однако, ASP.NET на самом деле несколько сложнее, чем, как говорят, ThreadStatic, потому что отдельные запросы на самом деле могут обрабатываться несколькими потоками ... что, по моему мнению, происходит с ASP .NET заключается в том, что исполняющему потоку явно говорят о переключении контекста, конечно же, среда хостинга планирует потоки и имеет контекст, для которого необходимо выполнить httpcontext, поэтому он находит поток, сообщает потоку, в каком контексте он должен работать .. затем отправляет его в путь.

Таким образом, решение на самом деле не так уж и печально, поскольку, поскольку threadstatic намного проще и, вероятно, соответствует потребностям 95% времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...