Ваш метод действия должен быть асинхронным:
public async Task<JsonResult> GetCatalogs()
Как только ваш метод асинхронный, все остальное становится намного проще. Вы можете покончить с этими Task.Run()
вызовами и просто вызывать методы как обычно (при условии, что они асинхронные) и await
их. Возможно, имеет смысл объединить эти лямбды в отдельные асинхронные методы (или даже локальные методы C # 7):
protected async Task<IList<CustomObject1>> GetResults1()
{
CatalogsRepository catalogsRepository = new CatalogsRepository();
var resultList1 = catalogsRepository.getFirstCatalog();
return await resultList1.ToListAsync();
});
Важно: Чтобы получить результаты, вы должны использовать await
. Никогда не используйте Результат в асинхронной среде ASP.NET, потому что он заблокирован.
var jsonResult = Json(new
{
result1 = await task1,
learningMaterialTypeList = await task2,
contentAssociatedList = await task3
});
Что касается ваших вопросов:
Полезно ли загружать все каталоги, необходимые для этой страницы, и возвращать объект JSON?
Нет правил против этого. Это дизайнерское решение для вас. У профессионала меньше обходов, а объединение всех этих вещей в общедоступный интерфейс делает архитектуру более хрупкой.
Действительно ли он работает как многопоточный, если задачи вызывают один и тот же экземпляр класса? Или лучше создать экземпляр внутри каждой задачи?
В настоящей многопоточности в общем случае лучше работать с отдельными экземплярами, чтобы у каждого потока был свой независимый кэш памяти. Тем не менее, async - это не то же самое, что многопоточность , и фактически в ASP.NET вы гарантировано, что никакие две ваши задачи не будут выполняться одновременно (если вы ничего не делаете специально, чтобы это произошло). Вместо этого вы получаете одну нить за раз. Поток может измениться, и ваш асинхронный код будет перескакивать вокруг точек ожидания, но только один фрагмент кода запускается за один раз.