fa
Feedback
NeuroLook

NeuroLook

رفتن به کانال در Telegram

C# - обучающий канал Senior C# разработчика.

نمایش بیشتر
1 669
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-37 روز
-1130 روز
آرشیو پست ها
Исследуйте культуру Apple в @culturedappleinsight_series! Раскройте глубины мира Apple и его продуктов. Следите за нами для погружения в атмосферу Apple!

Обновите свой взгляд на технологии с @refreshtechlookapp_date! Откройте новые взгляды на мир технологий. Присоединяйтесь для обновления вашего технологического опыта!

Последние обновления технологий в @antipovtechupdates_reimagined! Изучайте перспективные технологии и инновации. Следите за нами для переосмысленных технологических обновлений!

Защитите себя от вредоносного ПО с @cybershielddefend_malware! Исследуйте методы киберзащиты и противодействия угрозам. Присоединяйтесь для обретения киберщита!

Ядро мудрости Android в @androidsageinsight_core! Получайте инсайты и практические советы по Android. Подписывайтесь для обогащения своего опыта!

Присоединяйтесь к сообществу клана в @cyberclanandroid_community! Обсуждайте кибервопросы и Android технологии. Следите за нами для обмена знаниями и опытом!

Отправляйтесь в галактику Android с @androidgalactic_development! Изучайте последние разработки и новинки. Присоединяйтесь для погружения в мир Android!

Аналитика и метрики в @insightfulmetricsit_analytics! Изучайте данные и их значимость для IT. Следите за нами для глубоких аналитических исследований!

Инновационные решения для вашего бизнеса в @blueprintsolutionai_business! Исследуйте AI и бизнес стратегии. Присоединяйтесь для фундаментальных решений!

Следите за последними технологическими новостями в @chronicleaijournaldaily_tech! Журнал о технологиях с ежедневными обновлениями. Подписывайтесь для быть в курсе событий.

🖥 Как "схлопнуть" вызовы, чтобы вызываемый код не "захлебнулся"? ▶️Итак, сценарий такой. В коде генерируются некие обновления, которые затем обрабатываются неким методом. Обновления могут генерироваться слишком часто, плюс метод обработки может тормозить, в результате обновления не успевают обрабатываться, накапливаются, обработчик потом делает лишнюю работу. Хотелось бы как-то "накопить" обновления, пока обработчик занят. Причём, сами данные для обновления уже "накапливаются", об этом заботиться не нужно, нужно только разрулить "накопление" запросов к обработчику, чтобы когда обработчик освободиться обрабатывать не все накопившиеся запросы на обновление по отдельности, а за один раз сразу весь пакет "обновлений" обработать. Вот так происходит сейчас:
async Task UpdateFoo()
{   ...
    await SaveAsync();
}

async Task UpdateBar()
{   ...
    await SaveAsync();
}

async Task UpdateBaz()
{   ...
    await SaveAsync();
}

async Task SaveAsync()
{   // здесь нужно сделать так, 
    // чтобы одновременно обрабатывался только 1 запрос
    // по окончании которого проверялось бы не было ли ещё запросов
    // и если были, то обновление запускалось бы ещё 1 раз (сразу за всё "накопленное")
    // и так пока есть обновления по окончании очередной обработки
}
Как это можно нормально написать? Для того, чтобы зайти один раз — понятно, SemaphoreSlim, видимо (с WaitAsync). А вот остальное как лучше сделать? ▶️Вариант решения. Общий пример, берём System.Threading.Channels.Channel<T>:
private readonly Channel<T> _channel = Channel<T>.CreateUnbounded();
Пишем метод разрегребания:
private Task _workerTask;

private async Task WorkerAsync()
{
    ChannelReader<T> reader = _channel.Reader;
    List<T> list = new();

    // ждём здесь, если в канале пусто
    while (await reader.WaitToReadAsync())
    {
        // забираем всё что есть
        // ну или можно счётчиком ограничить максимальное количество выгребаемых данных за раз
        while (reader.TryRead(out T data))
        {
            list.Add(data);
        }
        // пачка собрана, погнали. это можно в try-catch завернуть, чтобы воркер не падал
        await UseAsync(list);
        list.Clear();
    }
}
Стартуем воркер:
_workerTask = WorkerAsync();
Чтобы закинуть в канал:
_channel.Writer.TryWrite(x);
Чтобы закрыть канал (насовсем), и чтобы метод WorkerAsync завершился, нужно вызвать:
_channel.Writer.Complete();
await _workerTask;
Вот и все дела 🙃

Ozon Tech приглашает на C#-митап 29 марта | 19:00 Офлайн в Москве | Онлайн Какие темы в программе? #️⃣ ThreadPool, выявление
Ozon Tech приглашает на C#-митап 29 марта | 19:00 Офлайн в Москве | Онлайн Какие темы в программе? #️⃣ ThreadPool, выявление проблем при работе на высоких нагрузках, Алексей Калдузов, руководитель группы разработки C#-платформы. #️⃣ Причины медленной работы БД и способы оптимизации на примере PostgreSQL, Дмитрий Орлов, эксперт разработки, команда Metazon Inventory. #️⃣ Решение проблем шардированных БД, Артём Барабошин, старший C#-разработчик. А после докладов — уютный вечер за разговорами🍕 Зарегистрируйтесь, чтобы получить офлайн-билет или присоединиться к трансляции. erid: LjN8Jtu2A Реклама. Рекламодатель ООО «Озон Технологии».

#ПятничныйКвиз
#ПятничныйКвиз

Инновации в сельском хозяйстве с @agriculturepulse_innovation! Откройте новейшие технологии в аграрной сфере. Подписывайтесь для исследования инноваций в сельском хозяйстве!

Возглавьте команду мастеров секретов в @mastersofsecretsleader_team! Исследуйте тайны и секреты лидерства. Следите за нами для обучения секретам управления!

Добавьте технологии в жизнь в @additiontechworld! Исследуйте новейшие технологии и инновации. Присоединяйтесь для расширения своего технологического мира!

Настройтесь на гармонию с @harmonicsettingstunein_abloud! Исследуйте мир настроек и звуков. Присоединяйтесь для звукового настроя и медитации!

Этика в голосе технологий в @ethicsofitvoices! Обсуждайте этические вопросы и нормы в мире IT. Следите за нами для понимания этических аспектов технологий!

Слушайте голос этичного хакера в @ethicalhackervoice! Погрузитесь в этичное хакерство и кибербезопасность. Подписывайтесь для ценных советов и подходов в сфере хакерства!