C# Cooking
132 subscribers
42 photos
50 videos
70 links
Просветительский канал по языку C# CSharpCooking.github.io
Download Telegram
Вопрос:
Что такое интернирование строк?
Ответ:
Интернирование строк – это процесс сохранения одной копии каждой уникальной строки для уменьшения использования памяти. Этот процесс реализован в .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
👍2
Инфраструктура PLINQ, класс Parallel и объекты Task автоматически маршализируют исключения потребителю, то есть исключения автоматически перехватываются и повторно генерируются для вызывающего потока. Но, к сожалению, дело не сводится просто к перехвату DivideByZeroException. Поскольку параллельные библиотеки задействуют множество потоков, вполне возможна одновременная генерация двух и более исключений. Чтобы обеспечить получение сведений обо всех исключениях, по указанной причине исключения помещаются в контейнер AggregateException, свойство InnerExceptions которого содержит каждое из перехваченных исключений.

Как инфраструктура PLINQ, так и класс Parallel при обнаружении первого исключения заканчивают выполнение запроса или цикла, не обрабатывая любые последующие элементы либо итерации тела цикла. Однако до завершения текущей итерации цикла могут быть сгенерированы дополнительные исключения. Первое возникшее исключение в AggregateException доступно через свойство InnerException.

#aggregateexception #параллельноепрограммирование #сишарп #taskfactory #parallelprogramming #csharp #csharpdotnet #csharpprogramming
👍1
Параллелизм задач | Параллельное программирование
https://youtu.be/98Hyw6Xjn6o

#ПараллельноеПрограммирование #ПараллелизмЗадач
👍1
AggregateException часто содержит другие AggregateException. Например, когда дочерняя задача генерирует исключение. Чтобы упростить обработку, можно устранить вложенность, вызвав Flatten. Данный метод возвращает новый объект AggregateException с плоским списком внутренних исключений. Это позволяет избежать перебора вложенных AggregateException и упрощает код обработки ошибок из параллельных операций.

#flatten #aggregateexception #обработкаисключений #параллельныевычисления #csharp
👍1
КОЛЛЕКЦИИ ПРОИЗВОДИТЕЛЕЙ/ПОТРЕБИТЕЛЕЙ В C#

🔹 Производитель: добавление элемента.
🔹 Потребитель: извлечение с удалением.

📌 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
👍1
🔥 ConcurrentBag в действии!

Работает как связанный список связанных списков.
Метод Add пакета не допускает почти никаких состязаний, когда вызывается многими потоками одновременно.
Параллельные пакеты идеальны, когда количество вызовов Add и Таке сбалансировано в рамках потока.

🔍 Внутренняя кухня:
- Каждый поток имеет свой закрытый список.
- Извлечение происходит либо с "головы" своего списка, либо достигается "воровством" с "хвоста" другого.

📌 Важные моменты реализации:
- если поток добавляет элемент в свой закрытый список с числом элементов меньше двух, то накладывается блокировка на список, так как другой поток в это время может забирать данные текущего потока (stealing thread);
- если поток забирает элемент закрытого списка другого потока, то он забирает его не с "головы", а с "хвоста", то есть если в списке более двух элементов, то поток может заимствовать элемент без блокировки данного списка (в таком случае невозможно "состояние гонки", так как между добавляемым и забираемым элементом есть как минимум один промежуточный).

#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
👍1