Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Применение Task.WhenAll

#c_sharp #многопоточность #tpl


Подскажите пожалуйста, в чем особенность использования Task.WhenAll ?

Полазив в msdn понял, что он создает новую задачу, по завершении указанных задач
в параметре, однако, по сути он ничего не создает, кроме некой ссылки типа Task, с
которой я не могу понять что делать дальше. Если здесь создается просто ссылка, которой
я должен присвоить в дальнейшем новый объект типа Task, то тогда проще вызвать (имхо) 

Task.WaitAll(t, t1);
Task t2 = new Task(...);


или может быть я в неправильном направлении думаю. Подскажите пожалуйста пример использования
этого метода. Спасибо.
    


Ответы

Ответ 1



Сначала я неправильно прочитал вопрос и ответил про WaitAll. Допустим есть несколько экземплров Task, каждый из которых выполняет действие и возвращает результат. Затем, все эти результаты надо как-то обработать. WhenAll создаёт таск, который заканчивается, когда заканчиваются все таски в него переданные. При этом результатом этого таска будет массив результатов тасков аргументов. Также можно проанализировать состояние переданных тасков, их исключения и так далее. static void Main(string[] args) { var t1 = new Task(DoSomething1); var t2 = new Task(DoSomething2); t1.Start(); t2.Start(); var t3 = Task.WhenAll(t1,t2); Console.WriteLine(t3.Result.Sum()); } private static int DoSomething2() { return 3; } private static int DoSomething1() { return 5; }

Ответ 2



Как это вы не можете понять, что делать с объектом типа Task? С любой задачей можно сделать три вещи: дождаться ее окончания асинхронно await Task.WhenAll(a1, a2); // К этому моменту a1 и a2 уже завершились дождаться ее окончания синхронно (не очень полезный вариант - привожу для полноты картины) Task.WhenAll(a1, a2).Wait(); // тоже самое, что и Task.WaitAll(a1, a2) сформировать продолжение var a3 = Task.WhenAll(a1, a2).ContinueWith(...);

Комментариев нет:

Отправить комментарий