КРАТКАЯ ВЕРСИЯ:
Кто-нибудь может подтвердить, дает ли Task.Run/Task.WaitAll для неасинхронных c подфункций с вызовами EF что-нибудь для ASP. NET приложения?
ДЛИННАЯ ВЕРСИЯ:
У нас есть служба Asp. Net WebApi с методом, который выполняет несколько вызовов БД (все с использованием EntityFramework ) для сбора набора данных, которые возвращаются в один объект ответа. Мы разбили это на ряд подфункций и хотели, чтобы они выполнялись параллельно (ПРИМЕЧАНИЕ: ни одна из них не использует никаких асинхронных c вызовов).
Чтобы добиться некоторой формы параллельного кодирования, мы вызываем каждая функция с Task.Run, за которой следует Task.WaitAll:
public ResponseObject PopulateResponseObject(int id)
{
var response = new ResponseObject();
Task<DataSetA> dataSetATask = Task.Run(() => getDataSetA(id));
Task<DataSetB> dataSetBTask = Task.Run(() => getDataSetB(id));
Task.WaitAll(dataSetATask, dataSetBTask);
response.SetA = dataSetATask.Result;
response.SetB = dataSetBTask.Result;
return response;
}
Из того, что я читал, Task.Run может не сильно выиграть в приложении Asp. Net, и что это может привести к ненужным накладным расходам пула потоков.
Не тратим ли мы время на написание нашего кода таким образом?
ОБНОВЛЕНИЕ: мы знакомы с тем фактом, что EF имеет asyn c версий, но есть значительный объем кода, который необходимо изменить. Мы хотели бы оставить эти функции как есть.