Выключить асинхронный поток и сохранить данные в кеше - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть веб-приложение ASP.NET MVC 3 (.NET 4).

Это приложение извлекает данные из базы данных Oracle и смешивает некоторую информацию с другой базой данных Sql.
Многие таблицы объединены, и много чтения из базы данных.
Я уже оптимизировал все, что мог, и у меня нет проблем с этим.
Я использую кеширование для сохранения информации, которую мне не нужно извлекать снова и снова.

Теперь я хотел бы создать адаптивный интерфейс, и моя цель - представить пользователям отфильтрованные заголовки заказов и загрузить строки заказов в фоновом режиме.

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

До сих пор я использовал jQuery для вызова Ajax моего действия, где я извлекаю заголовки заказов и сохраняю их в кеше (System.Web.Caching.Cache).
После успешного вызова Ajax я запускаю другой вызов Ajax для извлечения строк (и снова сохраняю результат в кеше).

Работает довольно хорошо.

Теперь я пытался выяснить, могу ли я перенести часть этой логики с клиента на сервер.

Когда вызывается мое действие, я хочу получить заголовок заказа и запустить новый поток - отвечающий за выборку строк заказа - и вернуть результат клиенту.

В тестовом приложении я попробовал оба ThreadPool.QueueUserWorkItem и Task.Factory , но я хочу, чтобы сгенерированный поток получил доступ к моему кешу.

Я собрал тестовое приложение и сделал что-то вроде этого:

ТЕСТ 1

[HttpPost]
public JsonResult RunTasks01()
{
    var myCache = System.Web.HttpContext.Current.Cache;
    myCache.Remove("KEY1");

    ThreadPool.QueueUserWorkItem(o => MyFunc(1, 5000000, myCache));

    return (Json(true, JsonRequestBehavior.DenyGet));
}

ТЕСТ 2

[HttpPost]
public JsonResult RunTasks02()
{
    var myCache = System.Web.HttpContext.Current.Cache;
    myCache.Remove("KEY1");

    Task.Factory.StartNew(() =>
    {
        MyFunc(1, 5000000, myCache);
    });

    return (Json(true, JsonRequestBehavior.DenyGet));
}

MyFunc создает список элементов и сохраняет результат в кеше; довольно глупо, но это всего лишь тест.

Я хотел бы знать, если у кого-то есть лучшее решение или он знает о некоторых последствиях, я мог бы получить доступ к кешу в отдельном потоке ?!

Есть ли что-то, о чем мне нужно знать, чего следует избегать или я мог бы улучшить?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 04 ноября 2011

Одна возможная проблема, которую я вижу при вашем подходе, заключается в том, что System.Web.HttpContext.Current может быть недоступно в отдельном потоке. Поскольку этот поток может быть запущен позже, после завершения запроса. Я бы порекомендовал вам использовать классы в пространстве имен System.Runtime.Caching , которое было представлено в .NET 4.0 вместо старого HttpContext.Cache.

...