К основному контенту

Выполнение метода асинхронно в отдельном потоке в MVC. BackgroundWorker и Thread.

В своем проекте используем CacheDependency для динамического обновления кеша в зависимости от изменений в базе данных. При первом запуске устанавливаются зависимости: объект в кеше  - строка в базе данных. Если значения в строке таблицы базы данных меняются, то меняется кеш сбрасывается и данные запрашиваются для данной строки повторно.

В работе возникла следующая проблема. Если объектов > 500, то первый запуск выполняется долго. Как оказалось, установка зависимостей для каждого объекта со строками базы данных занимает большое количество времени (10-ки секунд), так как для каждого объекта выполняется запрос в базу данных по ключу. А чем больше объектов, тем больше запросов.

Чтобы решить эту проблему, я предложил записывать объекты в кеш асинхронно в отдельном потоке. Алгоритм следующий: считываем объекты из базы, отображаем их пользователям и параллельно запускаем процесс записи объектов в кеш. Пользователь видит данные сразу и не ждет пока они добавятся в кеш.

Сначала мы хотели использовать Asynchronous Controller, но так как классы по работе с объектами мы вынесли в отдельный проект, то всю логику по работе с кешем мы оставили в этом проекте и не стали переносить в контроллер. Для реализации асинхронности мы решили использовать BackgroundWorker.

var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += Наш метод сохранения объектов в кеш;
backgroundWorker.RunWorkerAsync();

Здесь нас ждала следующая проблема. Приложение MVC не отображало данные пользователям до тех пор, пока метод сохранения объектов в кеш не завершался. То есть по сути BackgroundWorker не работал.

Тогда мы стали использовать Thread.

 var thread= new Thread(Наш метод сохранения объектов в кеш);
 thread.Start();

И все получилось!

Метод выполнялся асинхронно в отдельном потоке, а пользователи уже работали с данными.

В следующий раз напишу более подробно о CacheDependency.

Комментарии

Популярные сообщения из этого блога

Пример взаимодействия с Odnoklassniki Rest API на C#.

Итак, как и обещал, продолжаю тему взаимодействия с различными API. В прошлый раз писал про  API ВКонтакте , сегодня напишу про API Одноклассников. Первое, что нам нужно сделать - это зарегистрироваться как разработчик на Одноклассниках. Сделать это можно по следующей ссылке  Форма регистрации разработчика приложений Получив права разработчика, необходимо зарегистрировать сайт как приложение. Подробно как это сделать можно прочитать  здесь После того как сайт будет зарегистрирован придет письмо, содержащее: Application ID: xxxxxx. Публичный ключ приложения: xxxxxxxxxxxxxxxxxxxxxxxxx. Секретный ключ приложения:  xxxxxxxxxxxxxxxxxxxxxxxxx. Ссылка на приложение: http://www.odnoklassniki.ru/games/xxxxx Используя эти данные можно начать работу с API. Для выполнения запросов к API пользователь должен авторизоваться в Одноклассниках. Добавляем на нашем сайте ссылку для авторизации пользователя: http://www.odnoklassniki.ru/oauth/authorize?client_id={0}&scope={1}&

C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)

В статье  C# POST. Отправляем запросы на адрес стороннего сервера  я рассказал про метод, с помощью которого можно работать с различным API, принимающими POST запрос и возвращающими ответ в виде json или xml. Сегодня я хочу написать, как я применял этот метод при работе с API  ВКонтакте. Для примера возьму задачу получения через API списка групп, в которых состоит пользователь. В первую очередь необходимо зарегистристрировать наш сайт как приложение ВКонтакте. Заходим по ссылке  http://vk.com/editapp?act=create&site=1  и подключаем наш сайт. Дальше задача  делится на две подзадачи, а именно: авторизация пользователя и обращение к API для получения списка групп. Для авторизации мы пользователю предлагаем перейти по следующей ссылке: http://api.vkontakte.ru/oauth/authorize? response_type=code&redirect_uri={0} &client_id={1} &scope={2} &display=page , redirect_uri - адрес страницы нашего сайта, куда будет возвращен пользователь после авторизации Вконтак

IIS (Internet Information Services) и applicationHost.config. Изменение доменных привязок.

Сегодня затронем тему настроек IIS (Internet Information Services). Речь пойдет о версии IIS 7.0 (7.5). Допустим у вас есть  большое количество поддоменов, которые нужно привязать к сайту или быстро исправить на уже существующих привязках IP адрес. Стандартный интерфейс IIS позволяет редактировать привязки по одной, что в нашем случае не очень-то удобно. См. картинку Чтобы ускорить процесс, нужно вспомнить, что все доменные привязки (и не только, а и другие настройки) хранятся в конфигурационном файле applicationHost.config. Данный файл находится по адресу C:\Windows\System32\inetsrv\config\ В файле отредактировать привязки можно очень быстро.