C# (C Sharp) programming
18.1K subscribers
980 photos
52 videos
8 files
782 links
По всем вопросам- @notxxx1

Реестр РКН: https://clck.ru/3Fk3kb

#VRHSZ
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
🧩 Задача на C#: почему воркер завис, хотя очередь почти пустая?

Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.


using System.Threading.Channels;

var queue = Channel.CreateBounded<int>(
new BoundedChannelOptions(1)
{
FullMode = BoundedChannelFullMode.Wait,
SingleReader = true
});

await queue.Writer.WriteAsync(1);

var worker = Task.Run(async () =>
{
await foreach (var job in queue.Reader.ReadAllAsync())
{
Console.WriteLine($"Start {job}");

if (job == 1)
{
await queue.Writer.WriteAsync(2);
await queue.Writer.WriteAsync(1); // retry
}

Console.WriteLine($"Done {job}");
}
});

await worker;


Вопросы:

1. Что появится в консоли?
2. На какой строке остановится обработка?
3. Почему await и свободные потоки пула не спасают?
4. Если увеличить вместимость канала до двух, проблема исчезнет?
5. Как организовать не больше трёх попыток на задачу, сохранив ограниченную очередь и одного обработчика?

Условие: нельзя использовать Task.Run для каждой повторной попытки, неограниченную очередь или отбрасывание сообщений.

👇 Найдите причину зависания и предложите исправление.
Awesome Jev - большая подборка инструментов для новой модели TypeSafe AI 🤗

Jev - новая быстрая ИИ-модель от TypeSafe AI для принятия структурированных решений внутри программ. Она выбирает из заданных вариантов, оценивает вероятность и уверенность, вместо генерации длинного текста.

В одном репозитории собрали проекты, SDK, исследования и гайды для работы с Jev - моделью класса System One, созданной для быстрых типизированных решений внутри программ.

В подборке уже есть:

- агенты для macOS, Android и браузера;
- семантический поиск по кодовой базе;
- инструменты для проверки кода и ответов LLM;
- плагины для Codex и Claude Code;
- MCP-серверы и SDK для Python, TypeScript, Go, Rust, .NET и других языков;
- демо с Doom, Mario, StarCraft, Civilization II и управлением дроном.

Jev возвращает структурированные решения с вероятностями и оценкой уверенности. Заявленная скорость ответа - 70–500 мс, стоимость - $0,042 за 1 млн входных токенов, выходные токены бесплатны.

🔗 GitHub: https://github.com/AnotiaWang/awesome-jev
🐞 Когда логов недостаточно: дамп памяти из C#

Баг возникает только на проде, а локально всё работает? Дамп позволяет сохранить состояние процесса и позже изучить стеки потоков и значения переменных, не воспроизводя проблему заново.

В .NET Blog разбирают создание дампа текущего процесса из C# на Windows через нативную библиотеку dbghelp.dll. Это способ встроить сбор диагностических данных прямо в приложение.

Полезно для тех, кто разбирается с трудноуловимыми сбоями и хочет видеть больше, чем сообщение об исключении.

https://devblogs.microsoft.com/dotnet/creating-a-memory-dump-in-csharp/
⚡ .NET 11 ускорили почти везде - от JIT и GC до LINQ и networking

Stephen Toub выпустил огромный разбор производительности .NET 11. Главная идея релиза — сотни небольших оптимизаций, которые вместе заметно уменьшают allocations, количество инструкций и стоимость горячих участков кода.

Что улучшили:

- JIT лучше деvirtualизирует вызовы и инлайнит код;
- расширили escape analysis - больше временных объектов остаётся на stack вместо heap;
- убираются лишние boxing и allocations;
- ускорены коллекции, LINQ, sorting и JSON;
- улучшены SIMD, threading и networking;
- многие оптимизации работают без изменения исходного кода приложения.
-
Показательный пример: в одном из тестов обработка nullable-значения ускорилась примерно с 9,6 нс до 2 нс, а временная allocation на 24 байта исчезла полностью. В другом случае foreach по IEnumerable<int> стал примерно в 5 раз быстрее и тоже перестал создавать лишний объект.

Разбор Microsoft: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-11/
🌦️ Красивый пример того, как может выглядеть современное приложение на Aspire

Команда показала полноценную интерактивную карту погоды на Node.js с живыми прогнозами и анимированным радаром.

Под капотом:

⚡ Express + OpenTelemetry API
⚛️ React 19 + Vite
🗺️ Leaflet для карты
🛰️ анимированный погодный радар и актуальные прогнозы
🧩 всё приложение оркестрируется через TypeScript AppHost

Хороший пример Aspire не в виде очередного Hello World, а как основа для полноценного приложения из нескольких сервисов.

https://aspire.dev/reference/samples/

@csharp_ci
🖥 C# снова показывает, что «удобный язык = медленный язык» давно не работает.

Автор ttfx портировал инструмент на C# и получил:

- до 140× быстрее Python
- до 2,12× быстрее Rust-версии 0.3.3, на которую ранее ссылался DHH

И всё это на Linux.

Современный C# здесь особенно интересен не только для backend: он отлично подходит для CLI, утилит, bash-подобных скриптов, сервисов и обычных приложений, при этом без заметной жертвы в производительности.

Хороший пример того, насколько далеко .NET ушёл от старого образа «Windows-only и тяжёлый runtime».

https://github.com/devmobasa/ttfx
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Самый неожиданный кандидат на звание самого быстрого JSON-сериализатора для .NET сейчас делает… CAPCOM.

Компания открыла REDox — высокопроизводительный движок для структурированных данных на C#, который используется как часть технологий вокруг её next-gen game engine.

REDox умеет работать не только с JSON, но и с:

- CBOR
- MessagePack
- TOML
- XML

Это компактный token-based DOM с упором на скорость и минимальные аллокации. Проект рассчитан на горячие пути вроде игровых конфигов и сериализации больших объёмов данных.

И да, речь о технологиях CAPCOM, стоящих за движком, на котором работают современные Resident Evil / Biohazard и другие игры компании.

Один из самых интересных .NET-проектов по сериализации пришёл не от Microsoft, а от разработчиков Resident Evil.

https://github.com/CAPCOM-TD-OSS/REDox
🖥 .NET 10 научился класть объекты на стек: escape analysis в JIT

Одна из самых полезных оптимизаций в .NET 10 работает незаметно. JIT проверяет, может ли объект пережить метод, в котором его создали. Если не может, объект размещается на стеке, а не в куче. Сборщику мусора отслеживать нечего, а сам объект можно разложить на отдельные поля и оптимизировать дальше.

Раньше это работало только для простых случаев. В .NET 10 на стек попадают ещё четыре вида объектов.

Маленькие массивы фиксированного размера, причём и из значимых типов, и из ссылочных:


int[] numbers = { 1, 2, 3 }; // теперь на стеке
string[] words = { "Hello", "World!" }; // тоже на стеке


Делегаты. Если лямбда не выходит за пределы метода, объект Func больше не уходит в кучу. Замыкание пока ещё аллоцируется, но это обещают доделать.

Объекты в полях локальных структур. Если массив лежит в поле структуры, а структура не покидает метод, массив тоже размещается на стеке. В ассемблере пропадает вызов аллокатора.

Заодно в JIT добавили девиртуализацию интерфейсов массивов, поэтому foreach по IEnumerable<T> над массивом теперь инлайнится. Ещё улучшили loop inversion и раскладку кода, а на Arm64 пауз GC стало меньше на 8–20%.

Переписывать ничего не нужно: привычный код с лямбдами и маленькими массивами просто начинает аллоцировать меньше после перехода на .NET 10.

https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/runtime#escape-analysis
Please open Telegram to view this post
VIEW IN TELEGRAM
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК

Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.

Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;

📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;

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

📂 В конце можно задать любой вопрос.

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot

Реклама.
О рекламодателе.
Одна задача, три языка: Rust, C# или C++?

В курсе Google *Comprehensive Rust* есть упражнение: найти длину трёхмерного вектора, а затем нормализовать его. Формула одна: √(x² + y² + z²). После этого каждую координату делим на полученную длину.

На скриншотах хорошо видна разница в стиле:

- Rust: iter().fold() собирает сумму квадратов, iter_mut() меняет координаты.
- C#: ReadOnlySpan для чтения, Span для изменения и обычный foreach.
- C++: std::vector, цикл по значениям для расчёта и по ссылкам для изменения.

Для тех, кто пишет на C#: Rust fold(0.0, ...) по смыслу близок к LINQ Aggregate(0.0, ...): оба сворачивают последовательность в одно значение через аккумулятор.

Чей вариант вам понятнее с первого взгляда?

@csharp_ci