Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Mostrar más📈 Análisis del canal de Telegram Библиотека шарписта | C#, F#, .NET, ASP.NET
El canal Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 21 872 suscriptores, ocupando la posición 6 212 en la categoría Tecnologías y Aplicaciones y el puesto 30 851 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 21 872 suscriptores.
Según los últimos datos del 10 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -87, y en las últimas 24 horas de -4, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 12.06%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 7.04% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 2 638 visualizaciones. En el primer día suele acumular 1 540 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 8.
- Intereses temáticos: El contenido se centra en temas clave como .net, шарписта, навигация, await, string.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Все самое полезное для C#-разработчика в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/b60af5a4
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 11 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.
public class DbContextMigrationsHealthCheck(DbContext dbContext) : IHealthCheck
{
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
var applied = await dbContext.Database
.GetAppliedMigrationsAsync(cancellationToken: cancellationToken);
var pending = await dbContext.Database
.GetPendingMigrationsAsync(cancellationToken);
if (pending.Any())
{
return HealthCheckResult.Degraded(
"Есть неприменённые миграции.",
data: new Dictionary<string, object>
{
{ "PendingMigrations", pending },
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
return HealthCheckResult.Healthy(
data: new Dictionary<string, object>
{
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
catch (Exception ex)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: ex);
}
}
}
Идея не ограничивается EF Core. Любая зависимость, которая доступна, но ещё не готова к работе:
• CMS — нужно прогреть кэш перед началом работы
• Биллинг — зависит от загрузки актуальных правил ценообразования
• Search API — ждёт готовности текущей версии индекса
Сервис здоров не тогда, когда открывает SQL-коннекшн. Сервис здоров, когда готов выполнять ту работу, для которой задеплоен.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторJsonSerializerOptions — GetTypeInfo<T>() и TryGetTypeInfo<T>(). Раньше, чтобы получить JsonTypeInfo<T>, приходилось вручную кастовать результат из не-дженерикового GetTypeInfo(Type).
// Раньше
JsonTypeInfo<MyType> info = (JsonTypeInfo<MyType>)options.GetTypeInfo(typeof(MyType));
// Теперь
JsonTypeInfo<MyType> info = options.GetTypeInfo<MyType>();
Если тип может быть не зарегистрирован — есть вариант с TryGetTypeInfo<T>(), который не бросает исключение, а возвращает bool.
if (options.TryGetTypeInfo<MyType>(out JsonTypeInfo<MyType>? typeInfo))
{
// typeInfo готов к работе
}
Изменение небольшое, но устраняет одну из тех мелких раздражающих вещей, с которыми сталкиваешься в реальных проектах.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewusing System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false;
print('H', ConsoleColor.Red);
print('e', ConsoleColor.Yellow);
print('l', ConsoleColor.Magenta);
print('l', ConsoleColor.Green);
print('o', ConsoleColor.Blue);
print(',', ConsoleColor.Red);
print(' ', ConsoleColor.Red);
print('w', ConsoleColor.Magenta);
print('o', ConsoleColor.Cyan);
print('r', ConsoleColor.Yellow);
print('l', ConsoleColor.Green);
print('d', ConsoleColor.Blue);
print('!', ConsoleColor.Red);
}
static void print(char letter, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.Write(letter);
}
}
Возьмите минутку перерыва и запустите.
💬 А у вас есть любимый бессмысленный кусок кода
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#entry_point"PerEndpoint": {
"Dashboard:Metrics": { "AbsoluteTtlSeconds": 300 },
"Employees:GetAll": { "AbsoluteTtlSeconds": 300, "SlidingTtlSeconds": 120 }
}
• MediatR Pipeline: кэш оборачивает query-хендлер прозрачно. Хэндлер вообще не знает, что его результаты кэшируются.
var cached = await _cache.GetAsync<TResponse>(cacheKey);
if (cached != null) return cached;
var result = await next(); // реальный запрос к БД
await _cache.SetAsync(cacheKey, result, CacheKeyPrefixes.EmployeesAll);
return result;
• Domain Events инвалидация: CacheInvalidationEventHandler автоматически сбрасывает кэш при любой записи. RemoveByPrefixAsync чистит все Employees:GetAll:* за раз, без перебора ключей.
• Диагностические заголовки X-Cache-Status: HIT/MISS в каждом ответе. Видно прямо в DevTools — кэш работает или нет.
• Админские эндпоинты: POST /cache/invalidate и GET /cache/stats для ручного управления
Кэширование — это инфраструктура, не бизнес-логика. Хендлеры не знают о кэше, команды не знают об инвалидации.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewInstall-Package Cloudmersive.APIClient.NETCore.DLP -Version 1.1.0Сам вызов выглядит так:
using Cloudmersive.APIClient.NETCore.DLP.Api;
using Cloudmersive.APIClient.NETCore.DLP.Client;
using Cloudmersive.APIClient.NETCore.DLP.Model;
Configuration.Default.AddApiKey("Apikey", "YOUR_API_KEY");
var apiInstance = new RedactApi();
var body = new DlpDocumentRedactionRequest();
DlpDocumentRedactionResponse result = apiInstance.RedactDocument(body);
В ответе приходит отредактированный документ и набор флагов Contains* — по одному на каждый тип данных. Это удобно, если нужно не просто скрыть данные, но и зафиксировать факт их присутствия в документе для аудита. Отдельно возвращается список страниц, на которых были внесены правки.
Для использования нужен API-ключ Cloudmersive — регистрация на их сайте, есть бесплатное использование.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view VECTOR_SEARCH().
• MAUI тоже не обошли стороной. Улучшили работу карт, ускорили TypedBinding, добавили аннотации неизменяемости для Color и Font. Для Android теперь минимально требуется API 24.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#пульс_индустрииint threshold = 10; var query = items.Where(x => x > threshold);Код читается легко. Но когда лямбда захватывает threshold, компилятор может сгенерировать объект-замыкание для хранения этого состояния. Microsoft явно документирует static-лямбды как способ запретить захват и предотвратить лишние аллокации. Почему это проблема В обычном коде это, как правило, не критично. Но на горячем пути повторное создание замыканий превращается в постоянный трафик на куче. GC начинает работать чаще, а производительность становится непредсказуемой и всё это из-за одной строки, которая выглядит абсолютно безобидно. Как исправить Если захват не нужен, скажите об этом явно:
var query = items.Where(static x => x > 10);
Или вынесите логику в отдельный метод:
static bool IsAbove(int x, int threshold) => x > threshold;
Если лямбда находится на горячем пути, смотрите на неё глазами performance-инженера, а не просто читателя кода. Захват состояния это повод насторожиться.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторproduction вскрывает серьёзные проблемы: разработчикам приходится бороться с непредсказуемыми галлюцинациями моделей, нестабильными API и сложной интеграцией в существующую архитектуру.
Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции LLM.
Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинареvar windowSystem = new ConsoleWindowSystem(RenderMode.Buffer);
var window = new Window(windowSystem)
{
Title = "Hello World",
Width = 50,
Height = 15
};
windowSystem.AddWindow(window);
windowSystem.Run();
Начиная с версии 2.0 появился fluent API:
var window = new WindowBuilder(windowSystem)
.WithTitle("Modern Hello World")
.WithSize(50, 15)
.Centered()
.WithColors(Color.DarkBlue, Color.White)
.Build();
Прямой вывод в консоль в этой библиотеке нельзя использовать — он ломает рендеринг. Вместо этого есть встроенный сервис логирования, который пишет в файл. Включается через переменные окружения:
export SHARPCONSOLEUI_DEBUG_LOG=/tmp/consoleui.log
export SHARPCONSOLEUI_DEBUG_LEVEL=Debug
Библиотека поставляется с готовыми элементами управления. Среди них разметочный контрол на основе Spectre.Console, кнопки, чекбоксы, многострочный редактор текста с прокруткой, дерево для иерархических данных, список с выбором и табличная сетка.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view{
"version": "0.1.1",
"url": "https://example.com",
"vouches": [
{
"url": "https://trusted-person.com",
"vouched_at": "2026-01-15"
}
]
}
И в <head> добавляете:
<link rel="human-json">
Браузерное расширение видит эту ссылку и проверяет: есть ли у этого человека люди, которые его одобрили. Если есть, и они находятся на расстоянии 1-2 хопа от Вас, сайт получает зелёный индикатор.
Если Вы добавите human.json сейчас, Вы будете в первой волне. Это как было с SSL 15 лет назад.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view[McpServerTool(IconSource = "https://example.com/icon.svg")]
public static string GetWeather(string city) { }
Инструменты в запросах к модели
Сервер может включить инструменты в запрос к модели языка, и она их вызовет. Модель выполняет инструмент, сервер обрабатывает результат и отправляет обратно. Это может повторяться несколько раз.
На клиенте объявляйте поддержку:
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(new() { Endpoint = new Uri("http://localhost:6184") }),
clientOptions: new()
{
Capabilities = new ClientCapabilities
{
Sampling = new SamplingCapability { Tools = new SamplingToolsCapability {} }
}
});
На сервере просто передавайте инструменты в запрос:
Tool rollDieTool = new Tool()
{
Name = "roll_die",
Description = "Rolls a six-sided die and returns 1-6."
};
Долгоживущие запросы
Раньше при разрыве соединения нужно было пересоединяться. Теперь сервер отправляет пустое событие с ID и может закрыть соединение. Клиент переподключится через этот ID.
На сервере:
builder.Services.AddDistributedMemoryCache();
builder.Services.AddMcpServer()
.WithHttpTransport()
.WithDistributedCacheEventStreamStore()
.WithTools<MyTools>();
В обработчик вызовите:
await context.EnablePollingAsync(retryInterval: TimeSpan.FromSeconds(5));
Задачи для долгих операций
Задачи хранят результаты надёжно и позволяют опрашивать состояние, получать результаты и отменять работу. Могут быть в состояниях: работает, требуется ввод, завершена, ошибка, отменена.
На сервере:
var taskStore = new InMemoryMcpTaskStore();
builder.Services.AddMcpServer(options => { options.TaskStore = taskStore; })
.WithHttpTransport();
Инструменты автоматически поддерживают задачи если возвращают Task:
[McpServerTool(TaskSupport = ToolTaskSupport.Required)]
public static async Task<string> ProcessData(int count, CancellationToken ct)
{
await Task.Delay(TimeSpan.FromSeconds(8), ct);
return $"Processed {count} records.";
}
На клиенте:
var result = await client.CallToolAsync(
new CallToolRequestParams
{
Name = "processDataset",
Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) }
});
var completedTask = await client.PollTaskUntilCompleteAsync(result.Task.TaskId);
Версия 1.0 это полноценная платформа для ИИ интеграции в .NET.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_newscreate_version() вместо create()
• Предварительные операции в подкаталоге .beta
REST API v1 GA
Foundry REST API v1 теперь production-ready. Все основные эндпоинты заморожены: чаты, ответы, встраивания, файлы, тонкая настройка, модели, хранилища векторов.
Если ваш SDK еще в pre-release, можете запросить REST API напрямую.
SDK обновления
.NET 2.0.0-beta.1: ImageBasedHostedAgentDefinition объединили с HostedAgentDefinition.
Foundry Local и VS Code
Foundry Local теперь поддерживает большие мультимодальные модели полностью автономно без облака.
AI Toolkit for VS Code v0.30.0 добавил Tool Catalog для поиска инструментов, Agent Inspector для дебага с F5 breakpoints и переделанный Agent Builder.
В марте SDK будут общедоступны. Обновитесь к RC сейчас, если используете.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
