TGStat
TGStat
Qidiruv uchun matnni kiriting
Ilg‘or kanal qidiruvi
  • flag Uzbek
    Sayt tili
    flag Russian flag English flag Uzbek
  • Saytga kirish
  • Katalog
    Kanal va guruhlar katalogi Hududiy to‘plamlar Tematik to‘plamlar Платные каналы Kanallar qidiruvi
    Kanal/guruh qo‘shish
  • Reytinglar
    Kanallar reytingi Guruhlar reytingi Postlar reytingi
    Brendlar va shaxslar reytingi
  • Analitika
  • Postlarda qidiruv
  • Telegram'ni kuzatish
  • Targ‘ibot
    Yandex Business orqali reklama TGStat Agency orqali kanallarda reklama TGStat.ru saytida reklama
.NET Разработчик

14 Oct 2019, 08:20

Telegram'da ochish Ulashish Shikoyat qilish

День двести пятьдесят седьмой. #ЗаметкиНаПолях
Использование потокобезопасных коллекций. Начало
Потокобезопасные элементы работают правильно, когда используются из нескольких потоков (задач) одновременно. Стандартные коллекции .NET (List, Queue или Dictionary) не являются потокобезопасными. Библиотеки .NET предоставляют классы потокобезопасных коллекций, которые можно использовать при создании многозадачных приложений: BlockingCollection, ConcurrentQueue, ConcurrentStack, ConcurrentBag, ConcurrentDictionary

ConcurrentQueue
Предоставляет потокобезопасную коллекцию, обслуживаемую по принципу "первым поступил — первым обслужен" (FIFO). Метод Enqueue добавляет элементы в очередь, а метод TryDequeue удаляет их. Обратите внимание, что, хотя метод Enqueue гарантированно сработает (очереди могут иметь бесконечную длину), метод TryDequeue вернет false в случае сбоя при извлечении из очереди.
Синхронизация обеспечивается внутри ConcurrentQueue. Если два потока вызывают TryDequeue в один и тот же момент, ни одна из операций не блокируется. При обнаружении конфликта между двумя потоками, один поток должен попытаться снова получить следующий элемент.
TryDequeue пытается удалить элемент из очереди. Это происходит атомарно по отношению к другим операциям в очереди. Если очередь была заполнена элементами a, b и c, и два потока одновременно пытаются удалить из очереди элемент, один поток удалит из очереди a, а другой поток удалит из очереди b. Оба вызова TryDequeue вернут true, потому что они оба смогли удалить элемент из очереди. Если каждый поток попытается извлечь ещё по одному элементу, один из потоков удалит из очереди c и вернёт true, тогда как другой поток найдёт очередь пустой и вернет false.
Третий метод, TryPeek, позволяет программе проверить элемент в начале очереди, не извлекая его. Заметьте, что даже если метод TryPeek возвратит элемент, последующий вызов метода TryDequeue в том же потоке, для извлечения этого элемента из очереди, может завершиться неудачей, если элемент будет извлечён в другом потоке.

ConcurrentStack
Класс ConcurrentStack обеспечивает поддержку потокобезопасных стеков Элементы обслуживаются по принципу «первым пришёл – последним обслужен» (LIFO). Метод Push добавляет элементы в стек, а метод TryPop извлекает их. Существуют также методы PushRange и TryPopRange, которые можно использовать для добавления или извлечения нескольких элементов.

Можно перечислить элементы очереди или стека (программа может использовать конструкцию foreach для работы с каждым элементом в очереди). В начале перечисления параллельная очередь предоставит моментальный снимок содержимого.
Свойство Count возвращает количество элементов в коллекции, а свойство IsEmpty сообщает, является ли коллекция пустой (его предпочтительнее использовать, вместо сравнения Count с 0). Но вследствие многопоточного использования, значения этих свойств могут сразу же терять актуальность из-за действий в других потоках.

ConcurrentBag
Представляет потокобезопасный контейнер неупорядоченной коллекции объектов. Метод Add помещают элементы в коллекцию, а метод TryTake извлекает их. Существует также метод TryPeek, но он менее полезен в ConcurrentBag, поскольку возможно, что последующий метод TryTake вернет другой элемент.
Контейнеры полезны для хранения элементов, когда порядок не имеет значения, и в отличие от наборов, контейнеры поддерживают дублирование элементов. ConcurrentBag оптимизирован для сценариев, в которых один и тот же поток будет как производить, так и потреблять данные, хранящиеся в контейнере. ConcurrentBag может принимать null в качестве допустимого значения для ссылочных типов.

Источники:
- Rob Miles “Exam Ref 70-483 Programming in C#”. 2nd ed - Pearson Education, Inc., 2019. Глава 1.
- https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent?view=netframework-4.8

513 6 0
Katalog
Kanal va guruhlar katalogi Kanallar to‘plamlari Kanallar qidiruvi Kanal/guruh qo‘shish
Reytinglar
Telegram-kanallar reytingi Telegram-guruhlar reytingi Postlar reytingi Brendlar va shaxslar reytingi
API
Statistika API'si Postlar qidiruvi API'si API Callback
Kanallarimiz
@TGStat @TGStat_Chat @telepulse @TGStatAPI
O‘qish
Академия TGStat Telegram tadqiqoti 2019 Telegram tadqiqoti 2021 Telegram tadqiqoti 2023
Kontaktlar
Справочный центр Qo‘llab-quvvatlash Email Vakansiyalar
Har xil narsalar
Foydalanuvchi shartnomasi Maxfiylik siyosati Ommaviy oferta
Botlarimiz
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot