en
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

Open in Telegram

Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

Show more
2025 year in numberssnowflakes fon
card fon
22 343
Subscribers
-424 hours
-417 days
-13930 days
Posts Archive
⚙️ Утилиты для асинхронного программирования AsyncEx — библиотека, которая облегчает работу с асинхронными операциями, предоставляя готовые решения для синхронизации, ожидания и контроля выполнения задач. Что есть под капотом AsyncLock — асинхронный мьютекс, который позволяет синхронизировать доступ к ресурсу без блокировки потока. В отличие от стандартных синхронных мьютексов, AsyncLock работает асинхронно, что предотвращает блокировку потоков в многозадачных приложениях. AsyncSemaphore — асинхронная версия семафора, которая ограничивает количество одновременно выполняющихся задач. AsyncLazy<T> — то асинхронная версия Lazy<T>. Она позволяет отложить выполнение ресурсоёмких операций до тех пор, пока они действительно не потребуются, при этом поддерживает асинхронный контекст. AsyncConditionVariable: Механизм синхронизации, позволяющий ожидать и уведомлять асинхронные задачи о состоянии ресурса. Это аналог ConditionVariable в синхронных приложениях, но с поддержкой асинхронных операций. AsyncEvent: Это асинхронная версия событий в C#, которая позволяет обрабатывать подписчиков и уведомления асинхронно. Это полезно для многозадачных приложений, где события должны быть обработаны в асинхронном контексте. TaskHelper: Утилита для работы с задачами, которая упрощает код для ожидания и обработки результатов асинхронных операций. Это помогает избежать дублирования кода и делает асинхронный код более читаемым.
Show all...
Photo unavailableShow in Telegram
🐸Библиотека шарписта #развлекалово
Show all...
😁 37 1
💯 Как продвинуть резюме в ТОП на HeadHunter В условиях высокой конкуренции важно не только иметь качественное резюме, но и знать, как сделать его заметным для рекрутеров. Существуют простые, но эффективные способы, которые помогут вам выделиться среди множества кандидатов и привлечь внимание работодателей. В карточках делимся проверенными методами, а в статье раскрываем всю суть. ➡️ Поднять себя в топ 🐸Библиотека шарписта
Show all...
🥱 3 2
Photo unavailableShow in Telegram
⚙️ Параллельная асинхронная обработка В высоконагруженных приложениях часто требуется запустить несколько независимых операций параллельно и дождаться их завершения полностью или частично. 🛠 Дождаться всех задачTask.WhenAll Когда нужно запустить сразу несколько независимых операций и обработать результаты только после того, как все они завершатся. 1. Запускаем задачи параллельно:
var loadUsers   = LoadUsersAsync();   // загрузка списка пользователей
var loadOrders  = LoadOrdersAsync();  // загрузка списка заказов
var loadCatalog = LoadCatalogAsync(); // загрузка каталога товаров
2. Ждём завершения всех
await Task.WhenAll(loadUsers, loadOrders, loadCatalog);
3. Получаем результаты
var users   = await loadUsers;   // List<User>
var orders  = await loadOrders;  // List<Order>
var catalog = await loadCatalog; // List<Product>
Console.WriteLine($"Пользователей: {users.Count}, заказов: {orders.Count}, позиций: {catalog.Count}");
Для задач с возвращаемым значением WhenAll вернёт массив результатов в том же порядке. Если нужно ограничить количество одновременных операций — обёрните запуск через SemaphoreSlim. Передавайте CancellationToken во все методы, чтобы можно было прервать все сразу. 🛠 Дождаться первой завершившейся задачиTask.WhenAny Когда важно получить результат как можно скорее и дальше обработать только первый ответ. 1. Запускаем конкурирующие задачи
var t1 = GetFromCacheAsync(userId, ct);
var t2 = GetFromDatabaseAsync(userId, ct);
var t3 = GetFromApiAsync(userId, ct);
2. Ждём первую завершившуюся
Task<Task<User?>> first = Task.WhenAny(t1, t2, t3);
Task<User?> winner = await first;
3. Получаем и обрабатываем результат
User? user = await winner;  
if (user != null)
    Console.WriteLine($"Данные получены от {GetSourceName(winner)}");
else
    Console.WriteLine("Пустой ответ от первого источника");
Передавайте единый CancellationToken через CancellationTokenSource, чтобы отменять все задачи разом. Назначайте разумный таймаут через Task.WhenAny с Task.Delay, чтобы не ждать вечно:
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5), ct);
var winner = await Task.WhenAny(t1, t2, t3, timeoutTask);
if (winner == timeoutTask) throw new TimeoutException();
Для большого числа конкурирующих операций рассматривайте использование Channel или Dataflow вместо запуска сотен Task. 🐸Библиотека шарписта #буст
Show all...
👍 16😁 2 1👾 1
💵 Подборка вакансий для шарпистов C#/.NET-разработчик — удалёнка. C# and MS SQL Developer — до 4 000 $, удалёнка. .Net Core Разработчик Junior — от 3 000, удалёнка. Backend-разработчик C# — удалёнка. C# разработчик — до 420 000 ₽, удалёнка. Бустер — Удалённо (в любом городе мира). ➡️ Еще больше топовых вакансий — в нашем канале С# Jobs
Show all...
Photo unavailableShow in Telegram
☝️ Последний шанс купить курсы Proglib Academy с доступом навсегда! Это не просто летняя распродажа, это финал эпохи. Мы дарим скидку 40% на все курсы, включая полностью обновлённый курс по Python (предложение НЕ ДЕЙСТВУЕТ только на курс по AI-агентам для DS-специалистов). Но главное: с 1 августа доступ ко всем новым курсам станет ограниченным. Успейте инвестировать в свои знания на самых выгодных условиях! 👉 Выбрать курс
Show all...
Photo unavailableShow in Telegram
☝️ Последний шанс купить курсы Proglib Academy с доступом навсегда! Это не просто летняя распродажа, это финал эпохи. Мы дарим скидку 40% на все курсы, включая полностью обновлённый курс по Python (предложение НЕ ДЕЙСТВУЕТ только на курс по AI-агентам). Но главное: с 1 августа доступ ко всем новым курсам станет ограниченным. Успейте инвестировать в свои знания на самых выгодных условиях! 👉 Выбрать курс https://proglib.academy/python
Show all...
Repost from TgId: 2055368043
Photo unavailableShow in Telegram
Что выведет код? 👾 — 1/1/2020 👍 — 2020-01-01 🥰 — 2020/1/1 ⚡️ — Error Библиотека задач по C#
Show all...
👍 179🥱 26 8🥰 1👾 1
Photo unavailableShow in Telegram
📎 Новостной дайджест То, что вы могли пропустить в потоке будней. — Июльские обновления .NET Вышли новые сервисные релизы .NET 8.0.18 и 9.0.7 с исправлениями багов и улучшениями для рантайма и ASP.NET. — Куда движется Critter Stack Запуск коммерческой консоли мониторинга Critter Watch для управления Wolverine и Marten, новые рецепты по работе с конкуренцией и параллелизмом, расширение декларативного доступа к данным и ряд небольших, но важных улучшений в экосистеме. — Роадмапы AutoMapper и MediatR AutoMapper нацеливается на внедрение source-генераторов для раннего обнаружения ошибок маппинга и улучшенной отладки, сохраняя при этом поддержку IQueryable и расширяемости. MediatR планирует ослабить привязку к DI-контейнеру ASP .NET Core, добавить новые «behaviors» для расширения поведения, встроенную поддержку паттерна Result и расширить сценарии использования — Как поднять резюме в топ 🐸Библиотека шарписта #свежак
Show all...
4
Photo unavailableShow in Telegram
✏️ Кроссворд на выходных Отвлечёмся от работы, но не совсем. Сегодня будем отгадывать термины из разработки. 1. Специальный оператор, возвращающий имя переменной, метода или типа как строку. 2. Модификатор метода, обозначающий его асинхронное выполнение в сочетании с await. 3. Специальный член класса, позволяющий обращаться к экземпляру как к массиву: obj[i]. 4. Модификатор, позволяющий объявить один класс/метод/структуру в нескольких файлах. 5. Ключевое слово, позволяющее из метода-итератора возвращать значения по одному. 6. Модификатор поля, гарантирующий свежесть данных при многопоточном доступе. 7. Контекст или модификатор, разрешающий небезопасный (низкоуровневый) код с указателями. Пишите под спойлер свои варианты в комментариях 👇 🐸Библиотека шарписта #междусобойчик
Show all...
4👾 2🌚 1
Photo unavailableShow in Telegram
🐸Библиотека шарписта #развлекалово
Show all...
😁 52💯 11
Photo unavailableShow in Telegram
📁 Файл с инструкциями вместо тысячи запросов Представьте: один файлик — и все последующие автодополнения подстраиваются под ваш корпоративный стандарт. В блоге .NET показали, как создать такой файлфайл и навсегда забыть о рутине при работе с GitHub Copilot. Создаёте в корне репозитория папку .github/ и внутри неё — copilot-instructions.md. В шапке указываете, к каким файлам применить правила, а дальше описываете свои стандарты ➡️ Dev блог Microsoft 🐸Библиотека шарписта #буст
Show all...
👍 13🌚 3 1
⚙️ Быстро потестить строку кода Иногда нам нужно на примере узнать как отработает LINQ запрос, к примеру. Можно пойти старым путём и создать отдельный файл в проекте с названием «Test123», но Rider предлагает иной вариант. Если Rider у вас настроен под хоткеи от Intellij, то достаточно одновременно нажать:
Ctrl + Alt + Shift + Insert
И IDE создаст вам временный файл, который не будет добавлен в контекст проекта. Просто, быстро и без боли. 🐸Библиотека шарписта #буст
Show all...
👍 10🤔 5 2🔥 2
Photo unavailableShow in Telegram
👨‍💻 Бесполезные знания для работы Не все аспекты программирования идут на пользу при реальной работе. Часто избыточные знания только мешают трезво оценить и написать фичу. Вот что думает наш админ:
Когда я начинал, мне рассказали, что многозадачность — это ключ к быстродействующим приложениям, и я потратил кучу времени, изучая все тонкости асинхронности. В итоге понял, что в реальных проектах асинхронность скорее игрушка, чем нужный инструмент.
💬 Есть ли у вас знания, которые так и не пригодились в работе? Делитесь в комментариях 👇 P.S. Если хотите задать вопрос сообществу или поделиться историей, заполните нашу гугл-форму. 🐸Библиотека шарписта #междусобойчик
Show all...
👍 9🤔 5🌚 5🥱 3😢 1
✏️ Промпт для пет-проектов Мы составили для вас промпт, который поможет выбрать идею для вашего следующего пет-проекта. Никаких долгих раздумий, используете промпт и к разработке. Промпт:
You are a fun-loving and creative C# developer, brimming with enthusiasm for coding and always eager to explore new and exciting projects. Your goal is to brainstorm a list of engaging and manageable pet-project ideas that leverage your C# skills. These projects should be fun to build, relatively self-contained, and offer opportunities for learning and experimentation. Finally, you will choose the most appealing project and outline the initial steps for getting started.
Это отличный способ не только генерировать идеи, но и подойти к созданию чего-то нового нестандартным способом. Занимаетесь пет проектами? Поставьте 👍, если да и 👾, если нет. 🐸Библиотека шарписта #буст
Show all...
👍 21👾 10 3😁 2🌚 1
Photo unavailableShow in Telegram
🐸Библиотека шарписта #развлекалово
Show all...
👍 32😁 10💯 8🥱 1👾 1
Photo unavailableShow in Telegram
⚡️ Асинхронная обработка в C# Асинхронные потоки IAsyncEnumerable позволяют эффективно обрабатывать последовательности данных, поступающих с задержками. В целом это положительно влияет на пользовательский опыт и скорость работы приложения 1. Базовый синтаксис:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

static async IAsyncEnumerable<int> GenerateSequenceAsync(int count, [EnumeratorCancellation] CancellationToken token = default)
{
    for (int i = 0; i < count; i++)
    {
        // Симулируем асинхронную задержку
        await Task.Delay(100, token);
        yield return i;
    }
}

static async Task ConsumeAsync()
{
    await foreach (var item in GenerateSequenceAsync(5))
    {
        Console.WriteLine($"Получено значение: {item}");
    }
}
• Ключевое слово async перед IAsyncEnumerable<T>. • yield return внутри асинхронного метода. • await foreach для потребления. 2. Обработка отмены и ошибок:
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
try
{
    await foreach (var item in GenerateSequenceAsync(10, cts.Token).WithCancellation(cts.Token))
    {
        Console.WriteLine(item);
    }
}
catch (OperationCanceledException)
{
    Console.WriteLine("Операция была отменена.");
}
• Передаём CancellationToken через атрибут [EnumeratorCancellation]. • Используем метод расширения .WithCancellation(token) для явной поддержки отмены в await foreach. 3. Советы по применению • Всегда учитывайте семантику отмены: пробрасывайте CancellationToken до источника потока. • Избегайте долгих синхронных операций внутри цикла генерации — это сведёт на нет преимущества асинхронности. • При больших объёмах данных комбинируйте с буферизацией через Channel<T> для сглаживания пиковой нагрузки. 💬 Нужны более продвинутые сценарии по использованию асинхронности? Пишите свои хотелки в комментариях, а мы их обязательно исполним 👇 🐸Библиотека шарписта #буст
Show all...
👍 10 4🔥 1😁 1
Photo unavailableShow in Telegram
👍 Как поднять резюме в топ В условиях жесткой конкуренции выделиться непросто, но возможно. В статье собрали 9 проверенных способов, которые помогут вам грамотно оформить резюме и выделить свои сильные стороны. ➡️ Поднять себя в топ 🐸Библиотека Go-разработчика
Show all...
3👾 3
Photo unavailableShow in Telegram
🚀 Анализ изменений с git log Команда git log позволяет понять, как эволюционировал код — просмотреть последовательность коммитов и метаданные. Просмотр истории:
git log
История коммитов построчно:
git log --oneline
Граф веток + метки (ветки, теги) для всех веток:
git log --graph --decorate --all
Показать diff последних двух коммитов:
git log -p -2
Коммиты за последние 2 недели от указанного автора:
git log --since="2 weeks ago" --author="ProgLib"
Настраиваемый формат: короткий хеш, дата, сообщение, автор:
git log --pretty=format:"%h %ad | %s%d [%an]" --date=short
💬 Вы смотрите историю log'ом или используете сторонние инструменты? 🐸Библиотека шарписта #буст
Show all...
🥰 7 2❤‍🔥 1
🚀 Анализ изменений с git log и git diff Команды git log и git diff позволяют понять, как эволюционировал код: первая — просмотреть последовательность коммитов и метаданные, вторая — сравнить содержимое файлов между состояниями. Просмотр истории:
git log
История коммитов построчно:
git log --oneline
Граф веток + метки (ветки, теги) для всех веток:
Show all...