Важно понимать, что когда продолжение не выполнилось из-за упомянутых флагов, оно не забыто и не отброшено – это продолжение отменено. Например, взгляните на приведенный на втором слайде код. Несложно заметить, что задача
Если нужно, чтобы задача
#программирование #сишарп #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
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
Вопрос:
Можно ли назвать лямбда-выражение делегатом?
Ответ:
Лямбда-выражение и делегат – это разные понятия в C#:
– Делегат – это ссылочный тип, который ссылается на метод. Делегат объявляется отдельно с использованием ключевого слова
– Лямбда-выражение – это анонимный метод, который может быть использован для инициализации делегата. Лямбда объявляется в виде
Лямбда-выражение не является делегатом, но оно может быть преобразовано в делегат. Когда мы присваиваем лямбду делегату, компилятор автоматически компилирует лямбду в отдельный анонимный метод и создает экземпляр делегата, который ссылается на этот метод. Поэтому строго говоря нельзя утверждать, что "лямбда-выражение – это делегат". Лямбда просто используется для инициализации делегата.
#лямбдавыражение #делегат #программирование #сишарп #lambdaexpression #delegate #csharp #csharpdotnet #csharpprogramming
Можно ли назвать лямбда-выражение делегатом?
Ответ:
Лямбда-выражение и делегат – это разные понятия в C#:
– Делегат – это ссылочный тип, который ссылается на метод. Делегат объявляется отдельно с использованием ключевого слова
delegate
.– Лямбда-выражение – это анонимный метод, который может быть использован для инициализации делегата. Лямбда объявляется в виде
(input params) => {method body}
.Лямбда-выражение не является делегатом, но оно может быть преобразовано в делегат. Когда мы присваиваем лямбду делегату, компилятор автоматически компилирует лямбду в отдельный анонимный метод и создает экземпляр делегата, который ссылается на этот метод. Поэтому строго говоря нельзя утверждать, что "лямбда-выражение – это делегат". Лямбда просто используется для инициализации делегата.
#лямбдавыражение #делегат #программирование #сишарп #lambdaexpression #delegate #csharp #csharpdotnet #csharpprogramming
Media is too big
VIEW IN TELEGRAM
Параллелизм задач. Планировщик контекста синхронизации.
#планировщикзадач #контекстсинхронизации #программирование #сишарп #taskscheduler #synchronizationcontext #csharp #csharpdotnet #csharpprogramming
#планировщикзадач #контекстсинхронизации #программирование #сишарп #taskscheduler #synchronizationcontext #csharp #csharpdotnet #csharpprogramming
Media is too big
VIEW IN TELEGRAM
Параллелизм задач. Task.Factory.FromAsync.
#параллелизмзадач #программирование #сишарп #taskfactory #taskparallelism #csharp #csharpdotnet #csharpprogramming
#параллелизмзадач #программирование #сишарп #taskfactory #taskparallelism #csharp #csharpdotnet #csharpprogramming
Вопрос:
Что такое интернирование строк?
Ответ:
Интернирование строк – это процесс сохранения одной копии каждой уникальной строки для уменьшения использования памяти. Этот процесс реализован в .NET Framework с использованием строкового пула интернирования (String Intern Pool).
Когда строка интернируется, проверяется наличие этой строки в пуле интернирования. Если строка уже есть в пуле, возвращается ссылка на строку из пула, а не создается новый экземпляр строки. Если строки нет в пуле, она добавляется туда, и возвращается ссылка на новый экземпляр строки.
Пример:
Тем не менее, стоит помнить, что не все строки автоматически интернируются в .NET. Литералы строк в исходном коде автоматически интернируются, но динамически созданные строки – нет, если только вы явно не вызовете метод
Интернирование может быть полезным, когда работают с большим количеством повторяющихся строк, чтобы оптимизировать использование памяти. Однако оно может быть неэффективным при работе со строками, которые редко повторяются.
#интернированиестрок #программирование #сишарп #stringintern #csharp #csharpdotnet #csharpprogramming
Что такое интернирование строк?
Ответ:
Интернирование строк – это процесс сохранения одной копии каждой уникальной строки для уменьшения использования памяти. Этот процесс реализован в .NET Framework с использованием строкового пула интернирования (String Intern Pool).
Когда строка интернируется, проверяется наличие этой строки в пуле интернирования. Если строка уже есть в пуле, возвращается ссылка на строку из пула, а не создается новый экземпляр строки. Если строки нет в пуле, она добавляется туда, и возвращается ссылка на новый экземпляр строки.
Пример:
string str1 = "Hello, World!";В этом примере, даже если
string str2 = string.Intern("Hello, World!");
Console.WriteLine(object.ReferenceEquals(str1, str2)); // Выведет "True"
"Hello, World!"
был создан дважды, обе переменные str1
и str2
ссылаются на один и тот же экземпляр строки в памяти благодаря интернированию.Тем не менее, стоит помнить, что не все строки автоматически интернируются в .NET. Литералы строк в исходном коде автоматически интернируются, но динамически созданные строки – нет, если только вы явно не вызовете метод
string.Intern()
.Интернирование может быть полезным, когда работают с большим количеством повторяющихся строк, чтобы оптимизировать использование памяти. Однако оно может быть неэффективным при работе со строками, которые редко повторяются.
#интернированиестрок #программирование #сишарп #stringintern #csharp #csharpdotnet #csharpprogramming
Инфраструктура PLINQ, класс
Как инфраструктура PLINQ, так и класс
#aggregateexception #параллельноепрограммирование #сишарп #taskfactory #parallelprogramming #csharp #csharpdotnet #csharpprogramming
Parallel
и объекты Task
автоматически маршализируют исключения потребителю, то есть исключения автоматически перехватываются и повторно генерируются для вызывающего потока. Но, к сожалению, дело не сводится просто к перехвату DivideByZeroException
. Поскольку параллельные библиотеки задействуют множество потоков, вполне возможна одновременная генерация двух и более исключений. Чтобы обеспечить получение сведений обо всех исключениях, по указанной причине исключения помещаются в контейнер AggregateException
, свойство InnerExceptions
которого содержит каждое из перехваченных исключений. Как инфраструктура PLINQ, так и класс
Parallel
при обнаружении первого исключения заканчивают выполнение запроса или цикла, не обрабатывая любые последующие элементы либо итерации тела цикла. Однако до завершения текущей итерации цикла могут быть сгенерированы дополнительные исключения. Первое возникшее исключение в AggregateException
доступно через свойство InnerException
.#aggregateexception #параллельноепрограммирование #сишарп #taskfactory #parallelprogramming #csharp #csharpdotnet #csharpprogramming
This media is not supported in your browser
VIEW IN TELEGRAM
Параллелизм задач. Создание собственных фабрик задач.
#параллелизмзадач #программирование #сишарп #taskfactory #taskparallelism #csharp #csharpdotnet #csharpprogramming
#параллелизмзадач #программирование #сишарп #taskfactory #taskparallelism #csharp #csharpdotnet #csharpprogramming
AggregateException
часто содержит другие AggregateException
. Например, когда дочерняя задача генерирует исключение. Чтобы упростить обработку, можно устранить вложенность, вызвав Flatten
. Данный метод возвращает новый объект AggregateException
с плоским списком внутренних исключений. Это позволяет избежать перебора вложенных AggregateException
и упрощает код обработки ошибок из параллельных операций.#flatten #aggregateexception #обработкаисключений #параллельныевычисления #csharp
Media is too big
VIEW IN TELEGRAM
Работа с
#aggregateexception #flatteningexceptions #handlingexceptions #csharp #dotnet #multithreading #parallelprogramming #asynchronous #async #await #concurrency #threading #taskparallellibrary #tpl #asyncprogramming #unittesting #exceptionhandling #errorhandling #codingtips #programmingtips #developerlife #softwaredevelopment #codinglife #coders #programmers #codingmemes #devhumor #techhumor #csharp #dotnet
AggregateException
. Методы Flatten
и Handle
.#aggregateexception #flatteningexceptions #handlingexceptions #csharp #dotnet #multithreading #parallelprogramming #asynchronous #async #await #concurrency #threading #taskparallellibrary #tpl #asyncprogramming #unittesting #exceptionhandling #errorhandling #codingtips #programmingtips #developerlife #softwaredevelopment #codinglife #coders #programmers #codingmemes #devhumor #techhumor #csharp #dotnet
КОЛЛЕКЦИИ ПРОИЗВОДИТЕЛЕЙ/ПОТРЕБИТЕЛЕЙ В C#
🔹 Производитель: добавление элемента.
🔹 Потребитель: извлечение с удалением.
📌
🔸 Реализации:
🔍 Основные методы:
-
-
-
-
✅ Атомарность: проверка + действие без блокировки.
🚀 TryTake: какой элемент извлекается?
- Стек: последний добавленный.
- Очередь: первый добавленный.
- Пакет: наиболее эффективный для удаления.
#Programming #ConcurrentProgramming #Multithreading #DotNet #CSharp #Coding #SoftwareDevelopment #Concurrency #DataStructures #Developer #CodingLife #SoftwareEngineering #Algorithms #DataSynchronization #ComputerScience #Tech #DeveloperCommunity #Code #LearningToCode #DeveloperTools #ProgrammingTips #CodingKnowledge #TechWorld #Technology #Innovation
🔹 Производитель: добавление элемента.
🔹 Потребитель: извлечение с удалением.
📌
IProducerConsumerCollection
: потокобезопасная коллекция.🔸 Реализации:
ConcurrentStack
, ConcurrentQueue
, ConcurrentBag
.🔍 Основные методы:
-
CopyTo
: копирование коллекции.-
ToArray
: преобразование в массив.-
TryAdd
: попытка добавления.-
TryTake
: попытка извлечения.✅ Атомарность: проверка + действие без блокировки.
🚀 TryTake: какой элемент извлекается?
- Стек: последний добавленный.
- Очередь: первый добавленный.
- Пакет: наиболее эффективный для удаления.
#Programming #ConcurrentProgramming #Multithreading #DotNet #CSharp #Coding #SoftwareDevelopment #Concurrency #DataStructures #Developer #CodingLife #SoftwareEngineering #Algorithms #DataSynchronization #ComputerScience #Tech #DeveloperCommunity #Code #LearningToCode #DeveloperTools #ProgrammingTips #CodingKnowledge #TechWorld #Technology #Innovation
This media is not supported in your browser
VIEW IN TELEGRAM
Параллельные коллекции. IProducerConsumerCollection<T>.
#Programming #ConcurrentProgramming #Multithreading #DotNet #CSharp #Coding #SoftwareDevelopment #Concurrency #DataStructures #Developer #CodingLife #SoftwareEngineering #Algorithms #DataSynchronization #ComputerScience #Tech #DeveloperCommunity #Code #LearningToCode #DeveloperTools #ProgrammingTips #CodingKnowledge #TechWorld #Technology #Innovation
#Programming #ConcurrentProgramming #Multithreading #DotNet #CSharp #Coding #SoftwareDevelopment #Concurrency #DataStructures #Developer #CodingLife #SoftwareEngineering #Algorithms #DataSynchronization #ComputerScience #Tech #DeveloperCommunity #Code #LearningToCode #DeveloperTools #ProgrammingTips #CodingKnowledge #TechWorld #Technology #Innovation
Media is too big
VIEW IN TELEGRAM
Параллельные коллекции: реализация очереди производителей/потребителей с использованием задач.
#ProducerConsumerQueue #ProgrammingTips #TaskManagement #CSharp #DotNet #ConcurrentProgramming #ThreadSafe #SoftwareDevelopment #CodingExamples #EnqueueMethod #AsyncAwait #TaskProgramming #ExceptionHandling #JobCancellation #TaskCompletion #DeveloperCommunity #CodeOptimization #CodingTips #ComputerScience #BackendDevelopment #Multithreading #ConcurrencyControl #CodeExecution #TechTips #CodingPractice #AlgorithmDesign #SoftwareEngineering #TaskControl #Technology #Innovation
#ProducerConsumerQueue #ProgrammingTips #TaskManagement #CSharp #DotNet #ConcurrentProgramming #ThreadSafe #SoftwareDevelopment #CodingExamples #EnqueueMethod #AsyncAwait #TaskProgramming #ExceptionHandling #JobCancellation #TaskCompletion #DeveloperCommunity #CodeOptimization #CodingTips #ComputerScience #BackendDevelopment #Multithreading #ConcurrencyControl #CodeExecution #TechTips #CodingPractice #AlgorithmDesign #SoftwareEngineering #TaskControl #Technology #Innovation
Ошероув Р. Искусство автономного тестирования с примерами на C# https://csharpcooking.github.io/theory/RoyOsherove-The-Art-of-Unit-Testing.pdf
#программирование #сишарп #csharp #unittesting
#программирование #сишарп #csharp #unittesting
Трансляции по параллельному программированию
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.
https://csharpcooking.github.io/posts/Broadcasts-Parallel-Programming/
#сишарп #параллельноепрограммирование #csharp #parallelprogramming
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.
https://csharpcooking.github.io/posts/Broadcasts-Parallel-Programming/
#сишарп #параллельноепрограммирование #csharp #parallelprogramming
C# Cooking
Трансляции по параллельному программированию
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.