🧩 Задача на C#: почему воркер завис, хотя очередь почти пустая?
Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.
Вопросы:
1. Что появится в консоли?
2. На какой строке остановится обработка?
3. Почему
4. Если увеличить вместимость канала до двух, проблема исчезнет?
5. Как организовать не больше трёх попыток на задачу, сохранив ограниченную очередь и одного обработчика?
Условие: нельзя использовать
👇 Найдите причину зависания и предложите исправление.
Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.
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
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 через нативную библиотеку
Полезно для тех, кто разбирается с трудноуловимыми сбоями и хочет видеть больше, чем сообщение об исключении.
https://devblogs.microsoft.com/dotnet/creating-a-memory-dump-in-csharp/
Баг возникает только на проде, а локально всё работает? Дамп позволяет сохранить состояние процесса и позже изучить стеки потоков и значения переменных, не воспроизводя проблему заново.
В .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 байта исчезла полностью. В другом случае
Разбор Microsoft: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-11/
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 не в виде очередного
https://aspire.dev/reference/samples/
@csharp_ci
Команда показала полноценную интерактивную карту погоды на Node.js с живыми прогнозами и анимированным радаром.
Под капотом:
⚡ Express + OpenTelemetry API
⚛️ React 19 + Vite
🗺️ Leaflet для карты
🛰️ анимированный погодный радар и актуальные прогнозы
🧩 всё приложение оркестрируется через TypeScript AppHost
Хороший пример Aspire не в виде очередного
Hello World, а как основа для полноценного приложения из нескольких сервисов.https://aspire.dev/reference/samples/
@csharp_ci
Автор
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
Самый неожиданный кандидат на звание самого быстрого 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
Компания открыла 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 работает незаметно. 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
Реклама.
О рекламодателе.
Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;
📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце можно задать любой вопрос.
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot
Реклама.
О рекламодателе.
Одна задача, три языка: Rust, C# или C++?
В курсе Google *Comprehensive Rust* есть упражнение: найти длину трёхмерного вектора, а затем нормализовать его. Формула одна:
На скриншотах хорошо видна разница в стиле:
- Rust:
- C#:
- C++:
Для тех, кто пишет на C#: Rust
Чей вариант вам понятнее с первого взгляда?
@csharp_ci
В курсе 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