C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Mostrar más📈 Análisis del canal de Telegram C# (C Sharp) programming
El canal C# (C Sharp) programming (@csharp_ci) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 18 302 suscriptores, ocupando la posición 7 331 en la categoría Tecnologías y Aplicaciones y el puesto 36 951 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 18 302 suscriptores.
Según los últimos datos del 11 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -27, y en las últimas 24 horas de 6, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 16.94%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 8.35% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 3 100 visualizaciones. En el primer día suele acumular 1 528 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 0.
- Intereses temáticos: El contenido se centra en temas clave como .net, api, логика, архитектура, string.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 12 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
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().
🧩 Пример из картинки показывает оба подхода — выберите тот, что лучше вписывается в вашу архитектуру.
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
