В настоящее время у нас есть этот код, который работает отлично:Правильного пути к синхронизировать параллельные задачи
Result result1 = null;
Result result2 = null;
var task1 = Task.Factory.StartNew(()=>
{
var records = DB.Read("..");
//Do A lot
result1 = Process(records);
});
var task2 = Task.Factory.StartNew(()=>
{
var records = DB.Read(".....");
//Do A lot
result2 = Process(records);
});
Task.WaitAll(task1, task2);
var result = Combine(result1, result2);
Теперь мы хотели бы использовать асинхронные аналоги DB функций, и мы используем эту новую модель:
Result result1 = null;
Result result2 = null;
var task1 = await Task.Factory.StartNew(async()=>
{
var records = await DB.ReadAsync("..");
//Do A lot
result1 = Process(records);
});
var task2 = await Task.Factory.StartNew(async()=>
{
var records = await DB.ReadAsync(".....");
//Do A lot
result2 = Process(records);
});
Task.WaitAll(task1, task2);
var result = Combine(result1, result2);
После того, как мы перешли на асинхронный режим, мы начали наблюдать аномальное поведение. Поэтому я задаюсь вопросом, является ли это правильным шаблоном для распараллеливания асинхронных вызовов?
Какое ненормальное поведение вы говорите конкретно? Перепутались ли задачи друг с другом? Не работали ли задания? –
Ваши 'result' должны возвращать значения задачи, а не закрывать переменные. Верните их из задач. – SLaks
Я предполагаю, что метод, который ждет на task1/2, немедленно вернется, что можно назвать ненормальным. –