Я пытаюсь выяснить, как использовать async
/await
правильно в слое данных моего приложения для параллельного выполнения нескольких запросов к базе данных.Выполнение нескольких запросов Linq Async
Я использую Entity Framework и Linq для выполнения своих данных.
Слой данных можно вызывать из любого типа приложения (MVC Web App, Web API Project, Win From, Windows Service и т. Д.), Поэтому результат метода должен быть единственным объектом.
public static async void GetLedger(long id, DateTime StartDate, DateTime EndDate)
{
var task_1 = DoComplexDBCallAsync1();
var task_2 = DoComplexDBCallAsync2();
var task_3 = DoComplexDBCallAsync3();
var task_4 = DoComplexDBCallAsync4();
var task_5 = DoComplexDBCallAsync5();
await Task.WhenAll(task_1, task_2, task_3, task_4, task_5);
var result = ProcessAndMergeResultsFromAllDBCalls(task_1.Result, task_2.Result, task_3.Result, task_4.Result, task_5.Result);
return result;
}
private static async Task<List<SomeComplexType>> DoComplexDBCallAsync1(long id)
{
using (var metadata = DataAccess.getDesktopMetadata())
{
var accounts = await (from row in metadata.db_GLAccount
where row.busID == id
select row).ToListAsync();
return accounts;
}
}
Как бы я изменить выше, чтобы вернуть один object
вместо Task<>
?
Должен ли я обернуть его другим методом, который вызывает метод async GetLedger
через прогон Task
или RunSynchronously()
и возвращает результаты? Если да, то как бы выглядел код и есть ли что-нибудь, о чем я должен знать?
Какова наилучшая практика в этом сценарии?
Ответ: ** вы не **. Он должен возвращать «Задачу», а не «пустоту» или возвращать фактический элемент. Это то, что позволяет ему правильно работать асинхронно. Если вы хотите, чтобы он выполнялся синхронно, просто создайте полностью синхронный метод, используя синхронный EF-код до конца. – Servy
Нет. Они должны быть асинхронными и иметь возможность видеть, что этот метод является асинхронным. Использование 'await' делает реализацию этой асинхронности намного проще, но она все еще должна быть там. – Servy