Главная страница
Случайная страница
Разделы сайта
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Сервис онлайн-записи на собственном Telegram-боте
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание,
но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
Для новых пользователей первый месяц бесплатно.
Чат-бот для мастеров и специалистов, который упрощает ведение записей:
— Сам записывает клиентов и напоминает им о визите;
— Персонализирует скидки, чаевые, кэшбэк и предоплаты;
— Увеличивает доходимость и помогает больше зарабатывать;
Начать пользоваться сервисом
Как продвинуть сайт на первые места?
Вы создали или только планируете создать свой сайт, но не знаете, как продвигать?
Продвижение сайта – это не просто процесс, а целый комплекс мероприятий,
направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
Ускорение продвижения
Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст,
она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней.
Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
Начать продвижение сайта
Коллекции, поддерживающие параллелизм
Библиотека параллельных расширений содержит набор классов, представляющих коллекции с различным уровнем поддержки параллелизма. Указанные классы сосредоточены в пространстве имён 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);
}
|