C# Cooking
130 subscribers
36 photos
49 videos
61 links
Просветительский канал по языку C# CSharpCooking.github.io
Download Telegram
Мощная особенность продолжений связана с тем, что они запускаются, только когда завершены все дочерние задачи. В этой точке любые исключения, сгенерированные дочерними задачами, маршализируются в продолжение.

В примере на слайде мы начинаем три дочерние задачи, каждая из которых генерирует исключение NullReferenceException. Затем мы перехватываем все исключения сразу через продолжение на родительской задаче.

#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
Расширяющий метод “поглощает” необработанные исключения задачи. Метод может быть улучшен добавлением кода для регистрации исключения.

#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
This media is not supported in your browser
VIEW IN TELEGRAM
Параллелизм задач. Расширяющий метод, продолжение и дочерние задачи.

#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
Важно понимать, что когда продолжение не выполнилось из-за упомянутых флагов, оно не забыто и не отброшено – это продолжение отменено. Например, взгляните на приведенный на втором слайде код. Несложно заметить, что задача t3 всегда будет запланирована – даже если t1 не генерирует исключение. Причина в том, что если задача t1 завершена успешно, тогда задача fault будет отменена, и с учетом отсутствия ограничений продолжения задача t3 будет запущена безусловным образом.

Если нужно, чтобы задача t3 выполнялась, только если действительно была запущена задача fault, то потребуется поступить так:
Task t3 = fault.ContinueWith (ant => Console.WriteLine ("t3"), TaskContinuationOptions.NotOnCanceled);
(В качестве альтернативы мы могли бы указать OnlyOnRanToCompletion; разница в том, что тогда задача t3 не запустилась бы в случае генерации исключения внутри задачи fault.)

#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
С помощью методов ContinueWhenAll и ContinueWhenAny класса TaskFactory выполнение продолжения можно планировать на основе завершения множества предшествующих задач. Однако эти методы стали избыточными после появления комбинаторов задач (WhenAll и WhenAny).

#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
Вызов ContinueWith более одного раза на той же самой задаче создает множество продолжений на единственном предшественнике. Когда предшественник завершается, все продолжения запускаются вместе (если только не было указано значение TaskContinuationOptions.ExecuteSynchronously, эта опция заставляет продолжения выполняться последовательно в том же потоке, что и предшествующая задача). Код на слайде ожидает одну секунду, а затем выводит на консоль либо 'ABCD', либо 'BACD'.

#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
👍1
Вопрос:
Можно ли назвать лямбда-выражение делегатом?
Ответ:
Лямбда-выражение и делегат – это разные понятия в C#:
– Делегат – это ссылочный тип, который ссылается на метод. Делегат объявляется отдельно с использованием ключевого слова delegate.
– Лямбда-выражение – это анонимный метод, который может быть использован для инициализации делегата. Лямбда объявляется в виде (input params) => {method body}.
Лямбда-выражение не является делегатом, но оно может быть преобразовано в делегат. Когда мы присваиваем лямбду делегату, компилятор автоматически компилирует лямбду в отдельный анонимный метод и создает экземпляр делегата, который ссылается на этот метод. Поэтому строго говоря нельзя утверждать, что "лямбда-выражение – это делегат". Лямбда просто используется для инициализации делегата.

#лямбдавыражение #делегат #программирование #сишарп #lambdaexpression #delegate #csharp #csharpdotnet #csharpprogramming
👍1