Сообщение Re: Tasks от 16.04.2020 15:51
Изменено 16.04.2020 16:18 Serginio1
S>Коллеги, подскажите, насколько корректно пытаться писать такой код?
S>Или это в принципе не правильно?
S>
S> var tasks = Task[]
S> {
S> ctx.GetTable<Table1>().ToArrayAsync(),
S> ctx.GetTable<Table2>().ToArrayAsync(),
S> // Здесь еще подобные строки
S> };
S> tasks.WaitAll(); // Валится с ошибкой InvalidOperationException: Выполнение команды не может быть продолжено до завершения отложенной асинхронной операции.
S>Лучше WhenAll
https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.8
Если какая-либо из переданных задач завершается в состоянии сбоя, возвращаемая задача также завершается в Faulted состоянии, где его исключения будут содержать статистическую обработку набора неупакованных исключений из каждой из предоставляемых задач.
Если ни одна из поставленных задач не завершилась сбоем, но по крайней мере один из них был отменен, то возвращаемая задача завершится в Canceled состоянии.
Если ни одна из задач не была прервана и ни одна из задач не была отменена, то результирующая задача завершится в RanToCompletion состоянии.
Если переданный массив или перечисление не содержит задач, то возвращаемая задача сразу же переходит в состояние RanToCompletion до того, как оно будет возвращено вызывающему объекту.
Там же пример обхода результатов
if (continuation.Status == TaskStatus.RanToCompletion) {
long grandTotal = 0;
foreach (var result in continuation.Result) {
grandTotal += result;
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000.0);
}
Console.WriteLine("\nMean of Means: {0:N2}, n = 10,000",
grandTotal/10000);
}
// Display information on faulted tasks.
else {
foreach (var t in tasks) {
Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
}
}S>Коллеги, подскажите, насколько корректно пытаться писать такой код?
S>Или это в принципе не правильно?
S>
S> var tasks = Task[]
S> {
S> ctx.GetTable<Table1>().ToArrayAsync(),
S> ctx.GetTable<Table2>().ToArrayAsync(),
S> // Здесь еще подобные строки
S> };
S> tasks.WaitAll(); // Валится с ошибкой InvalidOperationException: Выполнение команды не может быть продолжено до завершения отложенной асинхронной операции.
S>Лучше WhenAll
https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.8
Если какая-либо из переданных задач завершается в состоянии сбоя, возвращаемая задача также завершается в Faulted состоянии, где его исключения будут содержать статистическую обработку набора неупакованных исключений из каждой из предоставляемых задач.
Если ни одна из поставленных задач не завершилась сбоем, но по крайней мере один из них был отменен, то возвращаемая задача завершится в Canceled состоянии.
Если ни одна из задач не была прервана и ни одна из задач не была отменена, то результирующая задача завершится в RanToCompletion состоянии.
Если переданный массив или перечисление не содержит задач, то возвращаемая задача сразу же переходит в состояние RanToCompletion до того, как оно будет возвращено вызывающему объекту.
Там же пример обхода результатов
if (continuation.Status == TaskStatus.RanToCompletion) {
long grandTotal = 0;
foreach (var result in continuation.Result) {
grandTotal += result;
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000.0);
}
Console.WriteLine("\nMean of Means: {0:N2}, n = 10,000",
grandTotal/10000);
}
// Display information on faulted tasks.
else {
foreach (var t in tasks) {
Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
}
}Вот здесь много интересных паттернов
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern