C# 1001 notes
6.51K subscribers
329 photos
9 videos
2 files
313 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
加入频道
🧰 .NET Community Toolkit — полезная коллекция библиотек и API для .NET-разработчиков, созданная Microsoft и поддерживаемая сообществом. Этот набор инструментов не привязан к конкретному UI-фреймворку, а значит, его можно использовать в любых проектах — от десктопных приложений до веб-решений.

Среди ключевых компонентов — CommunityToolkit.Mvvm (облегченная MVVM-библиотека, наследник MvvmLight), CommunityToolkit.HighPerformance (оптимизации для работы с памятью и многопоточностью) и CommunityToolkit.Diagnostics (удобные методы валидации). При этом все инструменты уже применяются в реальных продуктах Microsoft, включая новый Microsoft Store.

Разработчики могут легко подключить NuGet-пакеты через Visual Studio, а документация доступна на Microsoft Docs. Планы по развитию публикуются в Roadmap, а для тестирования новых функций можно подключить пререлизные сборки.

🤖 GitHub
⚙️ Утилиты для асинхронного программирования в .NET

Если ты работаешь с async/await и хочешь писать более чистый, безопасный и удобный код — попробуй AsyncEx.

Это мощная библиотека с готовыми асинхронными инструментами:

🔒 AsyncLock — асинхронный мьютекс: синхронизирует доступ к ресурсу *без блокировки потока*.

🚦 AsyncSemaphore — ограничивает количество одновременно выполняющихся задач, но *в асинхронной манере*.

📦 AsyncLazy — отложенная инициализация, которая запускается только при первом вызове. Работает в `async`-контексте.

📡 AsyncConditionVariable — асинхронная переменная состояния: удобно ожидать/уведомлять задачи о смене состояния ресурса.

📣 AsyncEvent — асинхронные события: подписка и вызов обработчиков без блокировки.

🧰 TaskHelper — утилиты для работы с задачами: ожидание, отмена, управление результатами.

🚀 Как начать?

Просто установи через NuGet:

https://github.com/StephenCleary/AsyncEx
🖥 Полезная фишка в C#, о которой никто не знает

Этот прием позволяет создавать высокопроизводительные .NET-приложения.

Разработка надёжных, масштабируемых и быстрых .NET-приложений во многом зависит от того, как вы организуете конкуренцию и обработку данных.

Во время разработки .NET-приложений часто возникает необходимость передавать данные из одной части кода в другую.

Ранее для этого использовали такие конструкции, как Queue<T>, ConcurrentQueue<T> или BlockingCollection<T>.

Эти очереди оборачивали в классы и применяли для управления потоками данных.

Однако у таких решений есть существенный минус — сильная связанность кода. 💊

Channels в C# это малоизвестная, но мощная фишка, которая предлагает современный способ построения безопасных, асинхронных и высоконагруженных .NET-приложений.

Они реализуют паттерн "производитель-потребитель": один класс создаёт данные, другой их потребляет - при этом оба ничего не знают друг о друге.

Ключевым архитектурным моментом при работе с каналами является выбор между ограниченными и неограниченными каналами.

В этом гайд, где узнаете:

🟠Что такое C# Channels?
🟠 Ограниченные vs. неограниченные каналы
🟠 Фоновая обработка через Channels
🟠 Применение каналов в боевом ASP.NET Core-приложении
🟠 Лучшие практики и советы по работе с Channels
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 От разработчика до архитектора высоконагруженных систем! 🚀

Высоконагруженные системы — необходимость для крупных проектов. Пройдите тест, проверьте свои знания и получите скидку на курс «Highload Architect» от OTUS.

Вы научитесь:
Проектировать масштабируемые системы, способные обрабатывать миллионы запросов
Оптимизировать производительность и работать с отказоустойчивыми архитектурами
Использовать современные инструменты и технологии для создания высоконагруженных решений
Применять лучшие практики в проектировании и разработке серверных приложений

📌 Пройдите тест и получите скидку на курс!  Подробности уточняйте у менеджера

👉 Пройти тест https://otus.pw/PsxZ/?erid=2W5zFJUR9X6

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
📌 Как из HTML сгенерировать PDF в .NET с помощью PuppeteerSharp и Handlebars

Этот пример показывает, как взять HTML-шаблон, подставить данные через Handlebars и преобразовать его в PDF с помощью PuppeteerSharp.

- Читаем HTML-шаблон InvoiceTemplate.html и компилируем его в функцию.

- Подставляем данные, получаем готовый HTML.

- PuppeteerSharp скачивает Chromium.

- Открываем браузер в headless-режиме, создаём страницу, загружаем туда HTML.

- Сохраняем страницу как PDF в формате A4, с фоном и нужными отступами.

Код:

var template = File.ReadAllText("Templates/InvoiceTemplate.html");
var compiled = Handlebars.Compile(template);
string html = compiled(data);

// Скачать Chromium
var fetcher = new BrowserFetcher();
await fetcher.DownloadAsync();

// Рендер в PDF
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
byte[] pdf = await page.PdfDataAsync(new PdfOptions {
Format = PaperFormat.A4,
PrintBackground = true,
MarginOptions = new MarginOptions { Top = "50px", Right = "20px", Bottom = "50px", Left = "20px" }
});


Таким образом можно автоматизировать генерацию счётов, отчётов или любых документов из HTML прямо в C#.
⚙️☝️ Вебинар: Как Solidity обеспечивает доверие и прозрачность в взаимодействии пользователей

19 августа в 20:00 МСК мы разберемся, как технология блокчейн и смарт-контракты создают доверенную среду для всех участников. На примере реальных кейсов мы покажем, как эта технология применяется в децентрализованных финансах, голосованиях, управлении поставками и других критичных областях, где важна надежность и предсказуемость операций.

💪 Мы расскажем, как писать прозрачные и надежные системы для самых актуальных и перспективных технологий.
Запишитесь на вебинар и повышайте свою ценность на рынке. Все участникии получат индивидуальное предложение на курс «Solidity Developer».

👉 Для участия зарегистрируйтесь: https://otus.pw/Tdr7/?erid=2W5zFJetmkk

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖥 Большинство .NET разработчиков никогда с этим не сталкиваются.

Но это делает отладку в 10 раз проще.

Стандартный вид при отладке:

{Namespace.ObjectName}


Никакого контекста. Много путаницы.

Но всего одной строкой кода?

Теперь окно наблюдения показывает:


Order ORD-2025-002: Bob Evans - 89.50
Order ORD-2025-003: Maria Lee - 1200.00


В чём фишка?

Используйте DebuggerDisplay.

Добавляете этот атрибут в начало класса, чтобы контролировать, как будет отображаться информация о классе при отладке.

В следующий раз, когда будете смотреть на {Namespace.ObjectName}, помните: так не обязательно должно быть.
Please open Telegram to view this post
VIEW IN TELEGRAM