Этот вопрос относится к написанию масштабируемой и эффективной библиотеки классов пользовательского сеанса в C #, и я остро нуждаюсь в мудром совете.
Оригинальная тема, которая направляла меня на основании:
Я только что обнаружил, почему все сайты ASP.Net работают медленно, и я пытаюсь понять, что с этим делать
Надеюсь, что эту ветку можно отозвать из преисподней, поскольку я тратил последние 48 часов (с небольшим перерывом в работе), пытаясь реализовать идеи, объясненные здесь, и я должен признать, что я несколько потерян впространство для решения и был бы признателен за некоторую ясность.
Позвольте мне объяснить, где я нахожусь и что меня смущает и что я пытаюсь достичь.Здесь и обратно Джеймс и Джоэл поднимают большие вопросы, но конкретные реализации за ссылками оставляют меня немного в тени.
Я пытаюсь создать библиотеку классов / dll, которую я могу использовать в нескольких своих проектахчтобы обойти параметры сессионного состояния по умолчанию inproc, sql & stateserver.Это несколько ново для меня, поэтому прошу прощения за мое невежество.Кроме того, я в некотором роде плохо работающий asp.net / C # кодер, и некоторые из более тонких нюансов обобщений, безопасности потоков, блокировок и сериализации имеют тенденцию травмировать мою маленькую голову:))
У меня былоНачалось с создания пользовательского поставщика состояния сеанса, основанного на образце, который я нашел в MSDN, который пишет для доступа.Потом я нашел эту страницу, и ящик Пандоры был широко открыт, и теперь я не могу вернуть джинна в бутылку.Я вырыл больше, и я нашел шаблон для пользовательского модуля сессионного состояния, и я добавил это тоже в мою библиотеку классов.Итак, теперь у меня есть собственный провайдер и модуль, и после прочтения множества советов Джоэла я создал коллекцию элементов состояния сеанса, основанную на еще одном образце, который я нашел в MSDN.
Это былопервоначально основанный на хэш-листе, каким-то образом я превратил его в отсортированный список, а затем я, кажется, следовал шагам Джоэла один за другим в следующем:
lock (typeOf) переписан во всех файлах .csиспользовать lock (thisLock), где thisLock является частным статическим объектом согласно статье Rico, упомянутой здесь ... Я понимаю "концепцию" взаимоблокировок, но это моя первая попытка масштабировать сайт asp.net, и я не чувствуюкак Джо Архитектор совсем еще.Я не могу позволить себе быть ленивым здесь, потому что я не хочу опираться на шаткую основу, только чтобы получить кучу трудных для выявления ошибок дальше по дороге.
Затем я последовал совету Джоэла о «стройном"версия замков и это работает в моей classlib.И все же мое чувство паука покалывает, говоря мне, что я в основном все еще нахожусь в режиме послушания, а не в режиме просветления, то есть у меня нет видения в стиле NEO, где 1 и 0 танцуют в моем поле восприятия.
ИтакЯ продолжаю возвращаться на эту страницу, как беженец из романа Дэна Брауна, и теперь я смотрю на последнее предостережение Джоэла, в котором сообщается, что до тех пор, пока коллекция sessionstateitem не станет потокобезопасной, в мультивселенной ничего хорошего не может быть обеспечено.Так что я думаю, что пришло время начать освежать поточно-безопасные коллекции.
Именно тогда я начинаю читать статью MSFT о http://msdn.microsoft.com/en-us/library/dd997305.aspx SortedLists и других старых продуктах, но, видимо, не очень хорошие вещи, которые устаревают в пользудженерики.Теперь я на самом деле создал целые бизнес-уровни и слои linq, которые можно сериализовать и использовать для корзин покупок и хранить в автономной базе данных.
Но правда в том, что состояние сеанса, безопасность потоков, использование ОБА и модуля и поставщика, и отсутствиеиз всех образцов, которые здесь можно отладить, мой мозговой мозг постоянно краснеет, а радиатор прерывается.
MSFT говорит в приведенной выше ссылке: «Классы коллекций, представленные в .NET Framework 2.0, находятся в пространстве имен System.Collections.Generic. К ним относятся List, Dictionary и т. Д. Эти классы обеспечивают улучшенную безопасность типов и сравнение производительностиклассам .NET Framework 1.0. Однако классы коллекций .NET Framework 2.0 не обеспечивают никакой синхронизации потоков, пользовательский код должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются в нескольких потоках одновременно.
Мы рекомендуемклассы одновременных коллекций в .NET Framework 4, поскольку они обеспечивают не только безопасность типов классов коллекций .NET Framework 2.0, но и более эффективную и более полную безопасность потоков, чем обеспечивают коллекции .NET Framework 1.0 .. "
Итак, Джеймс Сорта пробежал по выходу, сказав, что я его получил, и это конец потока, но я испытал довольно странное поведение при отладке.
- Я использую веб-сайт для тестированиямоя сессияЕсли я укажу ОБА и модуль http, а пользовательский провайдер, то только модуль запускается на сайте проводки / тестирования, который я поднял.НО - если я изменю web.config реальной зрелой кодовой базы, он выберет провайдера.
Я понял, что могу использовать по одному за раз, чтобы сайт жгута указывал на провайдера, неиспользуя модуль.
Пока все нормально, но потом я обнаружил, что говорю себе: «Я ... у вас есть пользовательская коллекция, но она поточнобезопасна, мы все еще ее блокируем, если мы ее блокируем?это из-за пределов коллекции, то есть в модуле или в провайдере? Мой мозг говорит, что «потокобезопасность» инкапсулирована в самой коллекции.
И как я действительно знаю, что все эти медленные page.aspx / longpage.Примеры aspx, где нужно зависать в ожидании завершения потока, даже если пользователь в отчаянии щелкнул другую ссылку (какое разочарование? на веб-сайте? perish de думал!) ...
Так что в основном, какBugs Bunny, висевший на полуразрушенных остатках la bella luna, я умоляю тебя: «ПОЛУЧИ МНЕ ОТДЫХ ЗДЕСЬ ...»
Заранее благодарю за своевременное рассмотрение этого мати другие, имеющие огромное значение.
Лучшие,
Кэри Абрамофф, MCSD.NET (Десять лет .net, и я все еще хочу, чтобы все это было JQUERY, детка!)