Асинхронная задача в ASP.NET - PullRequest
1 голос
/ 21 апреля 2011

Я пытаюсь заставить сайт ASP.NET предварительно загружать большое количество объектов в кеш при запуске.Для создания каждого объекта требуется 2-10 секунд, что означает, что загрузка 1200+ объектов последовательно может занять до 40 минут.

Я, очевидно, не хочу, чтобы сайт загружался за 40 минут, поэтому простопридерживаться процедуры предварительной загрузки в Application_Start на самом деле не вариант.И я не могу переместить его вне контекста веб-приложения (то есть службы Windows или внешнего процесса), потому что мне нужен доступ к кешу.В идеале эта задача должна выполняться асинхронно, а сайт тем временем будет заниматься своими делами.Коллега предложил использовать класс BackgroundWorker для создания новой темы, что звучит как довольно хорошее решение.Однако, насколько я понимаю, этот конкретный класс действительно предназначен не для ASP.NET, а для WinForms.Я обеспокоен тем, что поток может быть прерван до его завершения.

  • Безопасно ли использовать класс BackgroundWorker в приложениях ASP.NET?
  • Какую другую альтернативу мне нужно решить?эта проблема?

ОБНОВЛЕНИЕ:

Я посмотрю в Windows AppFabric для лучшего кэширования, которое я могу загрузить из-за пределов веб-приложения.Однако до тех пор я должен идти дальше и использовать ASP.NET Cache и класс BackgroundWorker.Это не работает, и я задал новый вопрос, Загрузка объектов в кеш из нового потока .

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

Используйте Task Parallel Library (если вы используете .Net 4.0).Каждая реализация TPL предназначена для конкретного хоста, и есть одна для ASP.NET, что означает, что у вас есть свои собственные TaskScheduler и SynchronizationContext, которые соответствуют правилам, которые IIS налагает, когда дело доходит до потоков и контекста потоков.

Есть очень хорошая статья MSDN, объясняющая различные поведения TPL здесь .

Использование TPL очень просто, если вы знакомы с Lambda Expressions, и экономит вам много подпольного управления кодомтемы и пулы потоков.

1 голос
/ 21 апреля 2011

Вам необходимо постоянное представление модели хранилища!

Выполните эти поиски и сохраните результаты, например, в базе данных документов.Посмотрите на RavenDb .При этом вы можете сериализовать любой объект в базу данных и получить время отклика данных менее 1 секунды.

Затем вы можете использовать что угодно для выполнения работы и использовать веб-приложение ASP.NET для презентации.

1 голос
/ 21 апреля 2011

Альтернативным подходом было бы использование кеша на основе базы данных. Таким образом, ваша служба Windows (например) может выполнять запись в базу данных, но она все равно будет доступна из вашего приложения ASP.NET.

См., Например, хорошо разработанный Microsoft Блок приложения Enterprise Library Caching (хотя есть много других). Мы используем это для разделения кеша между 50 веб-сайтами и заполнения кеша из консольного приложения на ночь.

Независимо от того, как вы сгенерируете свой кэш (внутрипроцессный или внепроцессный), было бы целесообразно сохранить его в базе данных, иначе, если вы перезапустите приложение, большинство изображений будут недоступны в течение 40 минут или больше.

0 голосов
/ 21 апреля 2011

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

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

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