Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Коллекции, поддерживающие параллелизм






    Библиотека параллельных расширений содержит набор классов, представляющих коллекции с различным уровнем поддержки параллелизма. Указанные классы сосредоточены в пространстве имён System.Collections.Concurrent.

    Класс BlockingCollection< T> является реализацией шаблона «поставщик-потребитель». Этот класс реализует интерфейсы IEnumerable< T>, ICollection, IDisposable и имеет собственные элементы, описанные в табл. 21.

    Таблица 21

    Элементы класса BlockingCollection< T>

    Имя элемента Описание
    Add() Добавляет элемент в коллекцию
    AddToAny() Статический метод, который добавляет элемент в любую из указанных BlockingCollection< T>
    CompleteAdding() После вызова этого метода добавление элементов невозможно
    GetConsumingEnumerable() Возвращает перечислитель, который перебирает элементы с их одновременным удалением из коллекции
    Take() Получает элемент и удаляет его из коллекции. Если коллекция пуста, и у коллекции был вызван метод CompleteAdding(), генерируется исключение
    TakeFromAny() Статический метод, который получает элемент из любой указанной BlockingCollection< T>
    TryAdd() Пытается добавить элемент в коллекцию, в случае успеха возвращает true. Дополнительно может быть задан временной интервал и токен отмены
    TryAddToAny() Статический метод, который пытается добавить элемент в любую из указанных коллекций
    TryTake() Пытается получить элемент (с удалением из коллекции), в случае успеха возвращает true
    TryTakeFromAny() Статический метод, который пытается получить элемент из любой указанной BlockingCollection< T>
    BoundedCapacity Свойство возвращает максимальное число элементов, которое можно добавить в коллекцию без блокировки поставщика (данный параметр может быть указан при вызове конструктора BlockingCollection< T>)
    IsAddingCompleted Возвращает true, если вызывался CompleteAdding()
    IsCompleted Возвращает true, если вызывался CompleteAdding(), и коллекция пуста

    Продемонстрируем работу с BlockingCollection< T>, используя десять задач в качестве поставщика и одну в качестве потребителя:

    BlockingCollection< int> bc = new BlockingCollection< int> ();

    for (int producer = 0; producer < 10; producer++)

    {

    Task.Factory.StartNew(() =>

    {

    Random rand = new Random();

    for (int i = 0; i < 5; i++)

    {

    Thread.Sleep(200);

    bc.Add(rand.Next(100));

    }

    });

    }

     

    var consumer = Task.Factory.StartNew(() =>

    {

    foreach (var item in bc.GetConsumingEnumerable())

    {

    Console.WriteLine(item);

    }

    });

    consumer.Wait();

    Классы ConcurrentQueue< T>, ConcurrentStack< T>, ConcurrentBag< T> и ConcurrentDictionary< T> – это потокобезопасные классы для представления очереди, стека, неупорядоченного набора объектов и словаря. Предполагается, что данные классы будут использоваться в качестве ресурсов, разделяемых между потоками, вместо обычных классов-коллекций. Отличительная особенность данных коллекций – наличие Try-методов для получения (изменения) элементов. Такие методы удобны, так как исключают предварительные проверки существования и необходимость использования в клиентском коде секции lock.

    // используем объект типа ConcurrentStack< T>

    T item;

    if (concurrentStack.TryPop(out item)) // пытаемся извлечь элемент

    {

    UseData(item);

    }






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.