TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #3081 2.24K
День 2563. #ЗаметкиНаПолях
Планирование Задач с Coravel

Coravel — легковесная библиотека с открытым кодом, которая добавляет в .NET-приложения планирование фоновых задач, постановку в очередь, кэширование, отправку почты и трансляцию событий — и всё это без необходимости в отдельной инфраструктуре.

Основные преимущества:
- Не требуется база данных или брокер сообщений;
- Идеально подходит для небольших и средних приложений;
- Полная интеграция с внедрением зависимостей ASP.NET Core;
- Чистый и читаемый синтаксис.
Посмотрим, что вы можете сделать с Coravel.

Планирование задач
Создаём задачу:
public class DailyReportJob : IInvocable
{
public Task Invoke()
{
// Отправляем ежедневный отчёт…
return Task.CompletedTask;
}
}

Регистрируем:
builder.Services.AddScheduler();
builder.Services.AddTransient<DailyReportJob>();

Планируем:
app.Services.UseScheduler(sch =>
{
sch
.Schedule<DailyReportJob>()
.DailyAtHour(6); // Каждый день в 6 утра
});

Также можно использовать:
- .Hourly()
- .EveryMinute()
- .Weekly()
- .Cron("/5 *") для большего контроля

Очередь фоновых задач
Можно избежать блокировки основного потока для таких задач, как отправка email или обработка файлов.
Создаём вызываемую задачу:
public class ProcessWebhook : IInvocable
{
public Task Invoke()
{
// Фоновая задача…
return Task.CompletedTask;
}
}

Ставим в очередь:
var dispatcher = 
app.Services.GetService<IDispatcher>();
await dispatcher.EnqueueAsync<ProcessWebhook>();

Работает только в памяти: задачи теряются при перезапуске приложения. Идеально подходит для некритичных задач.

Трансляция событий
Система событий Coravel обеспечивает независимую связь между сервисами в одном приложении.
Определяем событие:
public record OrderPlacedEvent(int OrderId);

Создаём наблюдателя:
public class SendThankYouEmail :
IListener<OrderPlacedEvent>
{
public Task HandleAsync(OrderPlacedEvent e)
{
// Отправляем email о заказе e.OrderId…
return Task.CompletedTask;
}
}

Используем:
await dispatcher
.BroadcastAsync(new OrderPlacedEvent(123));


Рассылка писем с Razor-шаблонами
Определяем шаблон:
public class WelcomeMailable : Mailable<User>
{
public override void Build()
{
To(Model.Email)
.Subject("Добро пожаловать!")
.View("Emails.Welcome", Model);
}
}

Отправляем:
await mailer
.SendAsync(new WelcomeMailable(user));

Поддерживает отрисовку представлений из библиотек классов Razor или файлов .cshtml.

Простое кэширование
Встроенное кэширование в памяти для хранения часто используемых данных.
Хранение и извлечение из кэша:
var data = cache.GetOrAdd("top-products", 
() => {
return FetchTopProducts();
},
TimeSpan.FromMinutes(15));

Не требует дополнительной настройки.

Итого
Coravel доказывает, что мощная фоновая обработка задач в .NET не обязательно должна быть сложной. Он позволяет сосредоточиться на бизнес-логике, а не на инфраструктуре, предоставляя все необходимое для быстрого создания отзывчивых и поддерживаемых приложений.

Источник: https://thecodeman.net/posts/job-scheduling-with-coravel
  • 👍 8
More from @netdeveloperdiary
  1. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  2. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  3. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  4. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  5. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  6. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →