C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Больше📈 Аналитический обзор Telegram-канала C# (C Sharp) programming
Канал C# (C Sharp) programming (@csharp_ci) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 18 302 подписчиков, занимая 7 331 место в категории Технологии и приложения и 36 951 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 18 302 подписчиков.
Согласно последним данным от 11 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -27, а за последние 24 часа — 6, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 16.94%. В первые 24 часа после публикации контент обычно набирает 8.35% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 3 100 просмотров. В течение первых суток публикация набирает 1 528 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 0.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как .net, api, логика, архитектура, string.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Благодаря высокой частоте обновлений (последние данные получены 12 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
if (user != null &&
user.Name.Length > 0 &&
user.Subscription != null)
{
// ...
}
C# позволяет писать проще и выразительнее:
if (user is { Name.Length > 0, Subscription: not null })
{
// ...
}
✨ Что изменилось?
✔️ Нет ручных проверок на null - компилятор сам учитывает это в выражении
✔️ Условие читается как описание объекта, а не как набор проверок
✔️ Логика становится компактнее и легче сопровождается
Используйте pattern matching, чтобы избавляться от лишнего шума и писать более понятный код.DbContext как scoped и считают что этого достаточно.
На деле всё сложнее.
- DbContext не потокобезопасен.
Делить один экземпляр между потоками приводит к исключениям.
- DbContext лёгкий и должен жить недолго.
Создавай его часто, освобождай сразу.
- Неверная работа с контекстом ведёт к росту памяти и утечкам.
✅ Решения которые уже есть в EF Core
IDbContextFactory
Позволяет безопасно создавать контексты по запросу.
Подходит для фоновых задач, многопоточности и десктоп приложений.
DbContext Pooling
Переиспользует заранее подготовленные экземпляры.
Сбрасывает состояние после использования, снижает нагрузку на память и процессор.
Pooled DbContextFactory
Комбинирует фабрику и пул.
Даёт контексты по запросу и эффективно их переиспользует.
⚠️ Правила которые нельзя нарушать
- Никогда не дели DbContext между потоками.
- Всегда освобождай контекст с помощью using или возврата в пул.
Грамотное управление жизненным циклом DbContext повышает стабильность и масштабируемость и убирает скрытые утечки памяти которые годами портят EF Core проекты.
https://antondevtips.com/blog/top-10-mistakes-developers-make-in-ef-core/lock не работает с async/await, и многие пытаются заменить его чем угодно, лишь бы компилилось. Правильный путь — использовать SemaphoreSlim с WaitAsync, как на примере: он позволяет ограничивать конкуренцию и работает корректно в асинхронном коде.
Главное — всегда освобождать семафор в finally и не забывать про таймауты, чтобы не создавать висячие блокировки.
Асинхронная синхронизация — это не магия, а аккуратность и понимание того, как работает планировщик задач в .NET.Handle<ConflictException>()
— Делаем паузу между попытками (`Delay = 1 сек`)
— Используем экспоненциальный backoff
— Добавляем jitter, чтобы избежать «шторма» повторов
— Ограничиваем количество попыток (`MaxRetryAttempts = 2`)
2) Timeout (ограничение времени выполнения)
— Ставим таймаут в 10 секунд на сетевой запрос
Далее создаётся pipeline и выполняется HTTP-запрос:
await pipeline.ExecuteAsync(async ct ⇒ await httpClient.GetAsync("https://modularmonolith.com", ct));
Эти две стратегии уже дают серьёзную устойчивость:
запросы не зависают, ошибки перехватываются, приложение остаётся стабильным даже при нестабильных сервисах.
https://github.com/App-vNext/Polly
public class PaymentClient
{
private readonly string _baseUrl;
public PaymentClient(string baseUrl)
{
_baseUrl = baseUrl;
}
public async Task<bool> ChargeAsync(ChargeRequest request)
{
using var http = new HttpClient();
http.BaseAddress = new Uri(_baseUrl);
var response = await http.PostAsJsonAsync("/charge", request);
return response.IsSuccessStatusCode;
}
}
Под нагрузкой:
- растёт количество TIME_WAIT соединений
- часть запросов получает timeout
- p95 и p99 по этому методу улетают в космос
Какой вариант исправления правильный?
1. Увеличить Timeout у HttpClient и ServicePointManager.DefaultConnectionLimit.
2. Сделать HttpClient статическим полем и переиспользовать его во всех запросах.
3. Зарегистрировать HttpClient через IHttpClientFactory и использовать пул подключений, конфигурируя таймауты и политику повторов.
Как думаешь, какой вариант правильный?
public async Task<User> GetUserAsync(int id)
{
using var conn = new SqlConnection(_conn);
conn.Open(); // 👈 синхронный блокирующий вызов
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM Users WHERE Id = @id";
cmd.Parameters.AddWithValue("@id", id);
using var reader = cmd.ExecuteReader(); // 👈 тоже блокировка
if (await reader.ReadAsync())
return Map(reader);
return null;
}
Под нагрузкой резко растёт:
- очередь ThreadPool
- количество заблокированных потоков
- p99 latency
Какой вариант исправления правильный?
1. Заменить ExecuteReader на ExecuteReaderAsync, но оставить conn.Open() как есть.
2. Вынести всё выполнение в Task.Run и пусть код работает на отдельных потоках.
3. Переписать весь путь на асинхронный: использовать OpenAsync, ExecuteReaderAsync и полностью убрать sync-over-async.
Как думаешь, какой вариант правильный?IExceptionHandler, который реализует паттерн try- прямо внутри middleware.
### Как это работает?
✅ Ты сам указываешь, какие типы исключений хочешь перехватывать
✅ Если ты обработал ошибку — возвращаешь true, и цепочка остановится
✅ Можно выстроить несколько обработчиков подряд — они вызовутся по очереди, пока один не справится
📦 Это больше не про громоздкие try-catch или тонны if — теперь всё централизовано и масштабируемо.
🔧 Идеально для:
- Глобальной обработки ошибок
- Разделения логики по типам исключений
- Подключения к логгерам, метрикам, retry-логике
📚 Пример кода и объяснение:
Подходит всем, кто пишет на ASP.NET Core или строит APIЭ
#dotnet #aspnetcore #обработкаошибок #middleware #backend #csharp[Timestamp]. EF автоматически будет обновлять версию записи и проверять конфликт изменений.
🟦 Вариант 2 - через Fluent API
Если не хотите засорять модель атрибутами, то же самое можно описать в OnModelCreating с помощью .IsRowVersion().
🧩 Пример из картинки показывает оба подхода — выберите тот, что лучше вписывается в вашу архитектуру.
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
