Библиотека шарписта | C#, F#, .NET, ASP.NET
21.6K subscribers
2.91K photos
46 videos
91 files
5.39K links
Все самое полезное для C#-разработчика в одном канале.

Наши курсы: https://clc.to/y3LDtw

По рекламе: @tproger_sales_bot

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
Forwarded from Библиотека программиста
👀 Как вы смотрите видео?

Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?

Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.

🕰️ Опрос займёт около 3 минут.

В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.

🔗 Поделиться опытом

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🚀 C# Dev Kit: сначала открытый файл, потом весь solution

Открыли большой solution и ждёте, пока IDE разберётся со всеми проектами? В предварительной версии C# Dev Kit 11.0 Microsoft изменила порядок загрузки: активный файл получает подсказки и диагностику первым.

В замерах команды для Aspire с 407 проектами готовность активного файла сократилась с «до 84,1 секунды» до 0,47 секунды. Весь solution загрузился за 3 секунды вместо 84,1. Это результаты конкретного проекта, не обещание ускорить любой репозиторий в 180 раз.

⏬ Что изменили под капотом

— добавили кеш модели проектов для повторных открытий;
— объединили шесть managed-процессов в один сервер;
— собрали этот сервер через Native AOT.

Версия 11.0 пока доступна в pre-release. Если хотите проверить эффект на своём solution, переключитесь на предварительную версию расширения. Первое построение кеша и повторная загрузка — разные сценарии: измерять их стоит отдельно.

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Кеш пустой, а в базу одновременно пришли сто запросов

Популярная запись исчезла из кеша. Сто запросов одновременно увидели промах и пошли за ней в базу. Кеш есть, а нагрузка всё равно прилетела залпом — это cache stampede.

HybridCache умеет объединять конкурентные обращения за одним ключом: один вызов получает данные, остальные ждут его результат.

var product = await cache.GetOrCreateAsync(
$"product:{id}",
async token => await repository.LoadAsync(id, token),
cancellationToken: cancellationToken);


Для регистрации нужен пакет Microsoft.Extensions.Caching.Hybrid и вызов builder.Services.AddHybridCache();. Без Redis тоже работают локальный кеш и защита от такого залпа.

⏬ Важная граница

Объединение запросов действует внутри одного экземпляра HybridCache. Два сервера могут одновременно обратиться к базе, даже если используют общий Redis. Это полезная защита локального кеша, но не распределённая блокировка на весь кластер.

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Forwarded from Типичный программист
Общая папка для работы Claude Code и Codex

Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:

Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову

В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.

#ии #инструменты
🧩 Mapperly: маппинг DTO, который можно открыть и прочитать

Вручную перекладывать двадцать свойств в DTO скучно. Но и разбираться, что библиотека сделает с ними во время выполнения, хочется не всегда. Mapperly предлагает другой вариант: сгенерировать обычный C#-код при сборке.

using Riok.Mapperly.Abstractions;

[Mapper]
public partial class UserMapper
{
public partial UserDto ToDto(User source);
}


Сигнатуру пишете вы, реализацию добавляет source generator. Её можно посмотреть и проверить: какие свойства перенеслись, как обрабатывается null и где выполняется преобразование.

⏬ Зачем это полезно

Маппинг не требует reflection во время выполнения. А диагностика сборки может предупредить о свойстве, которое не удалось сопоставить.

При этом генератор не знает бизнес-смысл данных. Если имя поля поменялось или преобразование требует правила, это нужно описать явно. Автоматизировать присваивания можно; проверку контракта DTO всё равно стоит оставить себе.

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👾3
Forwarded from Типичный программист
🧑‍💻 Какие навыки помогают вам в разработке в 2026 году?

Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?

Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.

Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.

👉 Пройти опрос
❤1
⚙️ Task.WhenAll не ограничивает число запросов

Если передать в Task.WhenAll тысячу задач обращения к API, он дождётся их завершения. Но ограничивать число одновременных запросов за вас не будет.

Когда нужно обрабатывать коллекцию с заданным параллелизмом, пригодится Parallel.ForEachAsync:

await Parallel.ForEachAsync(
ids,
new ParallelOptions
{
MaxDegreeOfParallelism = 8,
CancellationToken = cancellationToken
},
async (id, token) =>
{
await LoadAsync(id, token);
});


Здесь одновременно выполняются не более восьми обработчиков. Токен отмены передаётся внутрь каждой итерации. Поддерживается и источник IAsyncEnumerable.

⏬ Восемь обработчиков — не восемь запросов в секунду

Это ограничение конкурентности, а не rate limit. Если API разрешает фиксированное число запросов за минуту, нужен отдельный механизм ограничения частоты. И не делите один DbContext между параллельными итерациями: каждый обработчик должен работать с подходящим ему контекстом.

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
⚙️ PeriodicTimer: следующий тик не обязан ждать конца работы

Нужно регулярно обновлять данные в фоне, но не хочется запускать второй обход поверх первого? С PeriodicTimer можно построить один последовательный async-цикл.

using var timer = new PeriodicTimer(
TimeSpan.FromSeconds(10));

while (await timer.WaitForNextTickAsync(stoppingToken))
{
await RefreshAsync(stoppingToken);
}


Пока RefreshAsync не закончится, следующая итерация этого цикла не начнётся. Но это не то же самое, что «десять секунд отдыха после каждой работы».

⏬ Что случится с пропущенными тиками?

Таймер объединяет несколько тиков, пришедших между ожиданиями, в один. Если обновление заняло 25 секунд, не появится очередь из всех пропущенных запусков. Следующее ожидание может завершиться сразу.

У таймера должен быть один потребитель. Отмена ожидания через токен приводит к OperationCanceledException — её нужно учитывать при остановке фонового сервиса.

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧠 Таймаут ожидания — ещё не отмена операции

Что будет после трёх секунд ожидания?

Task request = LoadAsync();

await request.WaitAsync(
TimeSpan.FromSeconds(3));


❤️ — LoadAsync автоматически остановится
👍 — ожидание завершится по таймауту, операция может продолжиться
🔥 — заблокируется текущий поток

Ответ:
👍 Если request не успеет завершиться, await выбросит TimeoutException. WaitAsync ограничивает ожидание, а не останавливает исходную операцию. Для её отмены нужен CancellationToken, переданный в LoadAsync, и поддержка отмены внутри этой операции.

Не стоит считать таймаут гарантией, что работа больше не выполняется. Для HTTP-запроса, записи в файл или внешнего задания это разные обещания: «я больше не жду» и «операция действительно остановлена».

🔗 Источник

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2