У меня есть веб-приложение 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 создает список элементов и сохраняет результат в кеше; довольно глупо, но это всего лишь тест.
Я хотел бы знать, если у кого-то есть лучшее решение или он знает о некоторых последствиях, я мог бы получить доступ к кешу в отдельном потоке ?!
Есть ли что-то, о чем мне нужно знать, чего следует избегать или я мог бы улучшить?
Спасибо за вашу помощь.