csharpproglib | Unsorted

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

23284

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

Subscribe to a channel

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

⚙️ Передаём данные между потоками

В C# есть несколько способов передать данные из одного потока в другой. Выбор зависит от требований к производительности, удобству и безопасности. Несколько распространенных вариантов:

1️⃣ Использование BlockingCollection<T>

Это потокобезопасная коллекция, позволяющая передавать данные от одного потока к другому.

var collection = new BlockingCollection<int>();

// Поток-поставщик (Producer)
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
collection.Add(i);
Console.WriteLine($"Производитель: добавил {i}");
Thread.Sleep(500);
}
collection.CompleteAdding();
});

// Поток-потребитель (Consumer)
Task.Run(() =>
{
foreach (var item in collection.GetConsumingEnumerable())
{
Console.WriteLine($"Потребитель: получил {item}");
}
}).Wait();


2️⃣ Использование TaskCompletionSource<T>

Когда нужно передать значение между потоками в будущем.

var tcs = new TaskCompletionSource<int>();

// Поток-поставщик
Task.Run(() =>
{
Thread.Sleep(2000);
tcs.SetResult(42);
});

// Поток-потребитель
int result = await tcs.Task;
Console.WriteLine($"Получено: {result}");


3️⃣ Использование ConcurrentQueue<T>

Если нужно неблокирующее хранилище данных.

var queue = new ConcurrentQueue<int>();

// Поток-поставщик
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
queue.Enqueue(i);
Console.WriteLine($"Добавлено {i}");
Thread.Sleep(500);
}
});

// Поток-потребитель
Task.Run(() =>
{
while (true)
{
if (queue.TryDequeue(out int item))
{
Console.WriteLine($"Получено {item}");
}
Thread.Sleep(100);
}
}).Wait();


4️⃣ Использование Channel<T> (System.Threading.Channels)

Альтернативный подход к BlockingCollection<T>

var channel = Channel.CreateUnbounded<int>();

// Поток-поставщик
_ = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Производитель: {i}");
await Task.Delay(500);
}
channel.Writer.Complete();
});

// Поток-потребитель
await foreach (var item in channel.Reader.ReadAllAsync())
{
Console.WriteLine($"Потребитель: {item}");
}


💬 Какой вариант используете в проде?

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🛠 RabbitMQ плюс MassTransit

Мы уже давали мини гайд по RabbitMQ и MassTransit, и сейчас повторяем его как шпаргалку. Это один из самых прямых способов завести асинхронное общение сервисов в .NET без ручной возни с протоколом и очередями.

Какие инструменты нужны

• RabbitMQ. Брокер сообщений, который позволяет сервисам отправлять и получать сообщения асинхронно, используя очереди.

• MassTransit. Библиотека для .NET, которая предоставляет простой и удобный API для работы с брокерами сообщений.

Как использовать их вместе

1️⃣ Устанавливаем RabbitMQ

RabbitMQ можно развернуть в Docker:

docker run -d --hostname my-rabbit --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management


2️⃣ Настраиваем MassTransit

Необходимо зарегистрировать MassTransit и подключить его к RabbitMQ:
builder.Services.AddMassTransit(x =>
{
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost", "/", h =>
{
h.Username("guest");
h.Password("guest");
});
});
});


Этот код создает подключение к RabbitMQ, которое позволяет сервису отправлять и получать сообщения.

3️⃣ Создаем производителя

Производитель отправляет сообщения в очередь, используя MassTransit:
public async Task SendMessage(IBus bus, string message)
{
var endpoint = await bus.GetSendEndpoint(new Uri("queue:order-queue"));
await endpoint.Send(new OrderCreated { OrderId = Guid.NewGuid(), Message = message });
}


4️⃣ Создаем потребителя

Потребитель автоматически получает и обрабатывает сообщения из очереди:
public class OrderConsumer : IConsumer<OrderCreated>
{
public Task Consume(ConsumeContext<OrderCreated> context)
{
Console.WriteLine($"Получено сообщение: {context.Message.Message}");
return Task.CompletedTask;
}
}


💾 Сохраняйте мини-гайд себе, чтобы не потерять


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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

👣 JSON в классы через специальную вставку

Мы уже показывали этот трюк, и сейчас напомним, потому что он спасает часы ручного набора классов. В Visual Studio Edit → Paste Special → Paste JSON As Classes генерирует классы из JSON в буфере, включая атрибуты сериализации.

Пример:

  "Colors": [
{
"numberKey": 1,
"isPrimary": true,
"listColors": ["Red", "Blue", "Yellow"]
},
{
"numberKey": 2,
"isPrimary": false,
"listColors": ["Purple", "Green", "Orange"]
}
]
}


Сгенерированный C# код:
public class Root
{
public Color[] Colors { get; set; }
}

public class Color
{
public int NumberKey { get; set; }
public bool IsPrimary { get; set; }
public string[] ListColors { get; set; }
}



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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

⚙️ Scalar в ASP.NET вместо скучного Swagger

Мы уже делились этим материалом весной, и сейчас самое время напомнить. Scalar это интерактивный UI для OpenAPI, который можно подключить к ASP.NET Core и получить более приятную документацию, чем стандартный Swagger UI.

Процесс установки не сложный, а результат превзойдет все ожидания.

➡️ Прочитать статью

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

C# в 2026-м: от Task.Run к Agent.Run

Зачем просто писать асинхронный код, если можно запустить команду автономных агентов? В новом году Enterprise-разработка переходит на рельсы мультиагентности.

Прокачайте свой стек на курсе по AI-агентам:

— реализуйте паттерн ReAct для принятия решений внутри .NET систем;
— свяжите бизнес-логику с внешними API через n8n;
— освойте протокол MCP для межсистемного взаимодействия агентов;
— внедрите RAG для мгновенной обработки корпоративных данных.

Ваш идеальный дипломный проект: автономная группа агентов, решающая задачи за целый отдел.

❄️ До 12 января действует акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Стать архитектором агентов

Читать полностью…

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

⚡️ DeepSeek + .NET

Снова делимся с вами инструкцией по интеграции DeepSeek в .NET:

1. Создаём новое консольное приложение и устанавливаем необходимые пакеты: инициализируем проект и добавляем библиотеки для работы с HTTP-запросами и конфигурацией JSON.

2. Настраиваем файл appsettings.json: добавляем базовый URL и API-ключ DeepSeek для последующего взаимодействия с API.

3. Определяем модели данных: создаём классы для представления структуры запросов и ответов API.

4. Создаём сервис для взаимодействия с API: реализуем логику отправки сообщений и обработки ответов от DeepSeek.

5. Организуем взаимодействие с пользователем: настраиваем цикл, позволяющий пользователю вводить сообщения, отправлять их в API и получать ответы, обеспечивая непрерывный диалог.

📎 Статья с реализацией

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

💾 Как выбрать стратегию кэширования: разбор 7 популярных алгоритмов

Кешировать нужно с умом. И нет, LRU — не серебряная пуля.

В статье вас ждёт разбор алгоритмов: LRU, LFU, FIFO и другие
– Примеры, где каждый работает лучше
– Плюсы и минусы подходов
– Практические советы по выбору стратегии

Если проектируете систему с большими нагрузками или оптимизируете производительность — материал будет как раз.

➡️ Читать статью

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

👨‍💻 Давайте вновь поспорим, нужны ли комментарии в коде

💯 — Нужны
⚡️ — Можно и без них

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🎮 DI в Unity, чтобы проект не слипся в комок

Мы уже кидали этот материал в ленту в начале года, и сейчас напомним его снова. В Unity код часто завязывается на MonoBehaviour и Scene, из за этого зависимости расползаются и тестировать становится больно.

➡️ Статья как раз объясняет, почему с DI в Unity все не так гладко, как в обычном C#

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

💡 Красочно про LINQ

Вспоминаем лучшую шпаргалку 2025 по методам LINQ.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🧑‍💻 Универ, курсы или самоучка

Мы уже спорили про это раньше, а сейчас напомним, потому что под конец года многие планируют, как учиться дальше. Универ, курсы, самообучение это три разные модели, и у каждой свои риски.

➡️ Если хочется курсы, можно посмотреть, что есть в Proglib Academy.

💬 А у вас что сработало, универ, курсы или самообучение, и почему?

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🎮 Память в Unity и лаги, что реально чинит FPS

Мы делились этой статьей, и сейчас напомним. Главная мысль простая, лаги часто приходят не из за рендера, а из за памяти и резких скачков GC.

➡️ В статье объясняют, почему аллокации и сборщик мусора могут давать фризы и как с этим жить

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

#️⃣ Async Task в Unity против корутин

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

Поэтому если внутри корутины сделать блокирующую работу, игра встанет.

➡️ Освежить статью в памяти

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🎆 Праздники — время лучшего контента 2025

Новый год наступил, но мы не уходим на каникулы. Все праздники публикуем топовые посты года — те, что вы сохраняли в закладки и пересылали коллегам.

➡️ Ежедневные порции лучшего по хэштегу #лучшее_из_библиотеки_2025

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

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

Читать полностью…

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

👨‍💻 Жизненный цикл потока в C#

В C# потоки управляются через класс Thread из пространства имен System.Threading. Поток проходит несколько этапов на протяжении своего жизненного цикла. Давайте разберём эти этапы.

Unstarted. Не запущен

Поток создан, но ещё не запущен. Он находится в этом состоянии сразу после инициализации объекта Thread, но до вызова метода Start().

Thread thread = new Thread(MyMethod); 
// Поток создан, но не запущен


— Running. Выполняется


Поток начинает выполнение после вызова Start(). В этом состоянии поток выполняет код, переданный в качестве делегата.

thread.Start(); 
// Поток запущен и выполняется


Waiting. Ожидание

Поток приостанавливается, ожидая выполнения какого-либо условия или ресурса. Это может быть вызвано методами:

Thread.Sleep() — поток засыпает на заданное время.
Monitor.Wait() или lock — поток ожидает захвата монитора.
Thread.Join() — поток ожидает завершения другого потока.

Thread.Sleep(1000); 
// Поток приостановлен на 1 секунду


Blocked. Заблокирован

Поток заблокирован, пытаясь получить доступ к ресурсу, уже занятому другим потоком. Например, ожидание захвата блокировки через lock.

Stopped. Остановлен

Поток завершает выполнение. Это состояние наступает, когда метод, выполняемый в потоке, завершает работу или вызывается устаревший метод Abort(). Поток в этом состоянии больше нельзя запустить снова.

thread.Join(); 
// Основной поток ожидает завершения


Дополнительные состояния

Background. Фоновый поток

Поток может быть фоновым, если свойство IsBackground установлено в true. Фоновые потоки завершаются автоматически, когда завершается основной поток приложения.

thread.IsBackground = true; 
// Устанавливаем поток как фоновый


Suspended. Приостановлен (устарело)

Метод Suspend() приостанавливал выполнение потока, но был удалён из новых версий .NET из-за возможных проблем с безопасностью.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

⭐️ ValueTask в C#

Мы уже разбирали ValueTask раньше, но сейчас напомним ключевые моменты. ValueTask это структура, которая может хранить либо готовый результат, либо Task, чтобы избежать аллокаций в простых случаях.

Особенности использования ValueTask:

Повторное ожидание запрещено

Вызывать await несколько раз для одного и того же ValueTask нельзя, так как это может привести к неожиданным результатам:

ValueTask<int> task = GetValueAsync();
int value1 = await task;
int value2 = await task; // Ошибка


• Конвертация в Task

Eсли требуется передать ValueTask в API, которое ожидает Task, можно вызвать метод .AsTask():
Task<int> task = GetValueAsync().AsTask();


• Когда использовать ValueTask:

+ Операция часто завершается синхронно.
+ Создание объекта Task может быть слишком накладным.
+ Вы пишете библиотеку с высокой производительностью.

Когда НЕ использовать ValueTask:

- Операция всегда асинхронна.
- Производительность не является критически важной.
- Приложение не оптимизировано под работу с ValueTask.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

Чек лист по LINQ, который реально помогает

Тогда мы уже выкладывали похожий чек лист, и сейчас вспомним.

Основные принципы LINQ

✓ Понимать разницу между IEnumerable<T> и IQueryable<T>
✓ Фильтровать (Where()) данные как можно раньше в цепочке вызовов.
✓ Извлекать (Select()) только нужные поля, а не всю сущность.
✓ Использовать Any() вместо Count() > 0 для проверки наличия элементов.
✓ Избегать многократных проходов по коллекции (повторных .Where(), .Select())
✓ Знать разницу между отложенным и немедленным выполнением.

Работа с Where, Select, FirstOrDefault

✓ Не использовать Where().FirstOrDefault() – просто FirstOrDefault().
✓ Вызывать Where() перед Select(), а не наоборот.
✓ Использовать FirstOrDefault(predicate), если проверяется только одно значение.

Nullable

✓ Использовать ?? для значений, которые могут быть null.
✓ Использовать DefaultIfEmpty() при GroupBy().

Избегание дублирующих данных

✓ Использовать Distinct() для уникальных значений.
✓ Использовать Union() для объединения без дубликатов.
✓ Использовать Except() и Intersect() для разницы между коллекциями.

Помните, что LINQ — это не просто удобство, а инструмент, требующий понимания его тонкостей.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🔢 Сортировка строк с числами

Мы уже упоминали эту новость из Preview. Сейчас она в .NET 10, и стоит напомнить, что проблема file1, file10, file2 больше не актуальна.

Суть в CompareOptions.NumericOrdering. Issue #13979 висела с 2015, и вот она решена нативно. Флаг заставляет сравнивать цифры как числа, а не посимвольно, так что последовательности вроде версий или имен файлов идут правильно.

Протестить:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

var files = new List<string> { "file10", "file2", "file1", "file20" };

// Обычная сортировка
var sortedLex = files.OrderBy(f => f).ToList();
Console.WriteLine("Лексикографическая: " + string.Join(", ", sortedLex));
// file1, file10, file20, file2

// Числовая сортировка
var comparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
var sortedNumeric = files.OrderBy(f => f, comparer).ToList();
Console.WriteLine("Числовая: " + string.Join(", ", sortedNumeric));
// file1, file2, file10, file20


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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🤩 Паттерн-матчинг в C#

Pattern-matching — это функциональность языка, позволяющая проверять объект на соответствие определённому шаблону и выполнять действия, если объект удовлетворяет этим условиям.

Этот механизм помогает писать более читабельный и компактный код, устраняя необходимость в громоздких конструкциях вроде if-else или switch.

Паттерн-матчинг в C# активно развивается с каждой новой версией языка и поддерживает множество типов паттернов, таких как:

1️⃣ Проверка типа

Используется для проверки типа объекта и его преобразования в этом же выражении:

object obj = "Hello, world!";
if (obj is string str)
{
Console.WriteLine($"Длина строки: {str.Length}");
}


2️⃣ Константные паттерны

Проверяет значение переменной на соответствие константе:
int number = 42;
if (number is 42)
{
Console.WriteLine("Число равно 42");
}


3️⃣ Реляционные и логические паттерны

Сравнивает значения и комбинирует паттерны с помощью логических операторов (and, or, not):
int age = 25;
if (age is > 18 and < 30)
{
Console.WriteLine("Возраст в диапазоне от 18 до 30");
}


4️⃣ Паттерны в выражении switch

Улучшает конструкцию switch, позволяя использовать сложные условия:
object shape = new Circle { Radius = 5 };

string description = shape switch
{
Circle { Radius: > 0 } c => $"Круг с радиусом {c.Radius}",
Rectangle { Width: > 0, Height: > 0 } r => $"Прямоугольник {r.Width}x{r.Height}",
_ => "Неизвестная форма"
};



5️⃣ Свойственные паттерны

Позволяют проверять свойства объекта:
Person person = new Person { Name = "Alice", Age = 30 };

if (person is { Name: "Alice", Age: > 25 })
{
Console.WriteLine("Это Алиса старше 25 лет");
}


6️⃣ Список и позиционные паттерны

Используются для проверки списков и кортежей:
int[] numbers = { 1, 2, 3 };

if (numbers is [1, 2, 3])
{
Console.WriteLine("Массив содержит 1, 2, 3");
}


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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

💡 Рейтинг TIOBE за декабрь

Остальные языки теряют позиции и поднимаются вверх, а C# стабильно держит своё 5 место.

➡️ Рейтинг

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

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

#async_news

Читать полностью…

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

🤨 Неочевидная проблема FirstOrDefault

Метод FirstOrDefault из LINQ часто вводит в заблуждение разработчиков. Он берёт первый элемент из последовательности или выдаёт дефолтное значение типа, когда список пуст. Для структурных типов вроде int это 0, для ссылок null.

Возьмём пустой List<int>. Вызов numbers.FirstOrDefault() отдаст 0, и если в бизнес-логике 0 значит нет данных, код сломается тихо.

var numbers = new List<int>();
var result = numbers.FirstOrDefault(); // 0, а не то, что ожидали


Чтобы фиксить, проверяйте Any() заранее или цепляйте DefaultIfEmpty(-1). Тогда для пустоты выйдет контролируемое значение, код станет предсказуемым.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

Сколько задач нарешали за 2025 год

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

От монолитов к мультиагентным системам на C#

Интеграция LLM в .NET проекты — это уже не только Semantic Kernel. В 2026 году фокус смещается на создание автономных команд агентов, использующих паттерн ReAct.

На курсе «Разработка AI-агентов» мы разбираем, как строить такие системы профессионально.

В программе:

— архитектура «мозга» агента: связка Reasoning + Acting;
— оркестрация через n8n и работа с внешними API;
— протокол MCP от Anthropic для мультиагентного взаимодействия;
— глубокие системы поиска знаний (RAG) для работы с документами.

Это твой шанс войти в рабочий ритм с технологиями будущего.

🧨 До 12 января действует акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Начать обучение

Читать полностью…

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

🥇 Золотая лихорадка закончилась

2025-й стал годом «скучной стабильности» в айти. Компании не росли — выживали: резали бюджеты, оптимизировали команды, затягивали найм.

2383 отклика на 1 вакансию.
−20% позиций за год.
30-50% сокращений в e-commerce.

➡️ Полный разбор рынка

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

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

Читать полностью…

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

⚡️ Асинхронная обработка в C#

Тогда мы уже рассказывали про IAsyncEnumerable и await foreach. Сейчас повторяем, потому что это одна из тех фич, которую многие видели, но мало кто применяет осознанно.

Асинхронные потоки 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> для сглаживания пиковой нагрузки.

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

👀 Какую IDE выбрать для C# в 2026

Мы уже поднимали тему выбора IDE. Сейчас повторим, потому что смена IDE часто совпадает с переходом на новый проект или новый стек.

👍 За Visual Studio
🔥 За Rider
Остальное в комменты 👇

💬 Что у вас сейчас в роли основной IDE и что бесит больше всего в выбранном варианте?

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

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

#лучшее_из_библиотеки_2025

Читать полностью…

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

🎄 С Новым годом, шарписты!

var year = new Year(2026);
year.Wishes = new[] { "чистый код", "нулевой техдолг", "стабильный прод" };

while (year.InProgress)
{
await you.Ship(Features.Amazing);
await you.Avoid(Bugs.Critical);
you.Happiness++;
}


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

Читать полностью…
Subscribe to a channel