Так как ни один из ответов не был помечен как ответ, и я не думаю, что кто-либо действительно адресовал вопрос или проблему ...
В ASP.NET у вас есть глобальное или HttpApplication.Это работает так, что IIS будет кэшировать экземпляры вашего «приложения» (это экземпляр вашего глобального класса).Обычно (настройки по умолчанию в IIS) у вас может быть до 10 экземпляров Global, и IIS выберет любой из этих экземпляров для удовлетворения запроса.
Кроме того, имейте в виду, что может быть несколько запросовв любой момент времени.Это означает, что будут использоваться несколько экземпляров вашего глобального класса.Это могут быть экземпляры, которые были ранее созданы и кэшированы, или новые экземпляры (в зависимости от нагрузки, которую видит ваш IIS-сервер).
В IIS также есть понятие Пулов приложений и рабочих процессов.Рабочий процесс будет размещать ваше приложение и все экземпляры ваших глобальных классов (как обсуждалось ранее).Таким образом, это переводится в домен приложения (в терминах .NET).
Просто подытожим, прежде чем двигаться дальше ...
В вашем процессе Worker для вашего приложения будет несколько экземпляров вашего глобального класса.(в IIS).Каждый из них ожидает вызова IIS для удовлетворения запроса.IIS выберет любой из этих случаев.Они фактически являются потоками, которые были кэшированы IIS, и у каждого потока есть экземпляр вашего класса Global.Когда приходит запрос, один из этих потоков вызывается для обработки цикла запрос-ответ.Если несколько запросов поступают одновременно, то для удовлетворения каждого из этих запросов будет вызвано несколько потоков (каждый из которых содержит экземпляр вашего класса Global).
Двигаемся дальше ...
Поскольку в домене приложения будет только один экземпляр статического класса, вы фактически будете иметь один экземпляр вашего класса, общий для всех (до 10) экземпляров Global,Это плохая идея, потому что, когда несколько одновременных запросов попадут на ваш сервер, они будут либо заблокированы (если методы вашего класса используют блокировки), либо потоки будут наступать друг другу на пальцы.Другими словами, этот подход не является поточно-ориентированным по своей природе, и если вы делаете его поточно-безопасным с помощью примитивов синхронизации потоков, то вы без необходимости блокируете потоки, отрицательно влияя на производительность и масштабируемость вашего веб-приложения, без какой-либо выгоды.
Реальное решение (и я использую это во всех моих приложениях ASP.NET) состоит в том, чтобы иметь экземпляр вашего BLL или DAL (в зависимости от обстоятельств) для экземпляра Global.Это обеспечит следующее: 1. Несколько потоков не являются проблемой, поскольку IIS гарантирует один запрос-ответ на экземпляр Global) в любой данный момент времени.Таким образом, ваш код по своей сути безопасен для потоков.2. В любой момент времени у вас есть только до 10 экземпляров вашего BLL / DAL, которые гарантируют, что вы не будете постоянно создавать и утилизировать экземпляры (обычно) больших объектов для удовлетворения каждого запроса, что на загруженных сайтахогромный 3. Вы получаете действительно хорошую производительность благодаря № 2.
Вы должны убедиться, что ваш BLL / DAL действительно не имеет состояния или что вы сбрасываете любое состояние в начале каждого цикла запрос-ответ.Вы можете использовать событие BeginRequest в Global, чтобы сделать то, что вам нужно.
Если вы пойдете по этому пути, обязательно прочитайте мой блог в этом
Insttiing Business Layers- ASP.NET