Мощная особенность продолжений связана с тем, что они запускаются, только когда завершены все дочерние задачи. В этой точке любые исключения, сгенерированные дочерними задачами, маршализируются в продолжение.
В примере на слайде мы начинаем три дочерние задачи, каждая из которых генерирует исключение NullReferenceException. Затем мы перехватываем все исключения сразу через продолжение на родительской задаче.
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
В примере на слайде мы начинаем три дочерние задачи, каждая из которых генерирует исключение NullReferenceException. Затем мы перехватываем все исключения сразу через продолжение на родительской задаче.
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
Расширяющий метод “поглощает” необработанные исключения задачи. Метод может быть улучшен добавлением кода для регистрации исключения.
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
This media is not supported in your browser
VIEW IN TELEGRAM
Параллелизм задач. Расширяющий метод, продолжение и дочерние задачи.
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
Важно понимать, что когда продолжение не выполнилось из-за упомянутых флагов, оно не забыто и не отброшено – это продолжение отменено. Например, взгляните на приведенный на втором слайде код. Несложно заметить, что задача
Если нужно, чтобы задача
#программирование #сишарп #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
This media is not supported in your browser
VIEW IN TELEGRAM
Параллелизм задач. Условные продолжения.
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
#программирование #сишарп #csharp #csharpdotnet #csharpprogramming
С помощью методов
#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
ContinueWhenAll
и ContinueWhenAny
класса TaskFactory
выполнение продолжения можно планировать на основе завершения множества предшествующих задач. Однако эти методы стали избыточными после появления комбинаторов задач (WhenAll
и WhenAny
).#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
Вызов
#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
ContinueWith
более одного раза на той же самой задаче создает множество продолжений на единственном предшественнике. Когда предшественник завершается, все продолжения запускаются вместе (если только не было указано значение TaskContinuationOptions.ExecuteSynchronously
, эта опция заставляет продолжения выполняться последовательно в том же потоке, что и предшествующая задача). Код на слайде ожидает одну секунду, а затем выводит на консоль либо 'ABCD', либо 'BACD'.#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Параллелизм задач. ContinueWhenAll,
ContinueWhenAny,
WhenAll, WhenAny.
#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
ContinueWhenAny,
WhenAll, WhenAny.
#параллелизмзадач #программирование #сишарп #taskparallelism #csharp #csharpdotnet #csharpprogramming
👍1
Вопрос:
Можно ли назвать лямбда-выражение делегатом?
Ответ:
Лямбда-выражение и делегат – это разные понятия в C#:
– Делегат – это ссылочный тип, который ссылается на метод. Делегат объявляется отдельно с использованием ключевого слова
– Лямбда-выражение – это анонимный метод, который может быть использован для инициализации делегата. Лямбда объявляется в виде
Лямбда-выражение не является делегатом, но оно может быть преобразовано в делегат. Когда мы присваиваем лямбду делегату, компилятор автоматически компилирует лямбду в отдельный анонимный метод и создает экземпляр делегата, который ссылается на этот метод. Поэтому строго говоря нельзя утверждать, что "лямбда-выражение – это делегат". Лямбда просто используется для инициализации делегата.
#лямбдавыражение #делегат #программирование #сишарп #lambdaexpression #delegate #csharp #csharpdotnet #csharpprogramming
Можно ли назвать лямбда-выражение делегатом?
Ответ:
Лямбда-выражение и делегат – это разные понятия в C#:
– Делегат – это ссылочный тип, который ссылается на метод. Делегат объявляется отдельно с использованием ключевого слова
delegate
.– Лямбда-выражение – это анонимный метод, который может быть использован для инициализации делегата. Лямбда объявляется в виде
(input params) => {method body}
.Лямбда-выражение не является делегатом, но оно может быть преобразовано в делегат. Когда мы присваиваем лямбду делегату, компилятор автоматически компилирует лямбду в отдельный анонимный метод и создает экземпляр делегата, который ссылается на этот метод. Поэтому строго говоря нельзя утверждать, что "лямбда-выражение – это делегат". Лямбда просто используется для инициализации делегата.
#лямбдавыражение #делегат #программирование #сишарп #lambdaexpression #delegate #csharp #csharpdotnet #csharpprogramming
👍1
Media is too big
VIEW IN TELEGRAM
Параллелизм задач. Планировщик контекста синхронизации.
#планировщикзадач #контекстсинхронизации #программирование #сишарп #taskscheduler #synchronizationcontext #csharp #csharpdotnet #csharpprogramming
#планировщикзадач #контекстсинхронизации #программирование #сишарп #taskscheduler #synchronizationcontext #csharp #csharpdotnet #csharpprogramming
👍1