
Coravel帮助开发人员通过制作高级应用程序功能,例如任务/作业计划,排队,caching,邮寄(等等!)易于访问且易于使用,从而使开发人员启动并快速运行其.NET应用程序。带有简单,表达和直截了当的语法。
您可以在这里查看官方文档。

通常,您必须通过Windows Task Scheduler配置CRON作业或任务,才能完成一个或多个重新出现的任务。
使用Coravel,您可以在代码中使用简单,优雅,流利的语法在一个地方设置所有计划的任务!
Coravel为您提供了一个零配置的队列,该队列在内存中运行,以将漫长的任务卸载到后台,而不是让您的用户等待其HTTP请求完成!
Coravel为您提供易于使用的API用于您的.NET核心应用程序中。
默认情况下,它使用内存缓存,但还具有数据库驱动程序,以实现更强大的方案!
Coravel的活动广播可帮助您构建可维护的应用程序,这些应用程序是松散耦合的!
电子邮件并不像应有的那么容易。幸运的是,Coravel通过提供解决此问题:
appsettings.json快速简单配置您可以支持我在BuyMeacoffee上正在进行的开源工作。
这是您可以使用Coravel开始构建基本工人服务过程的速度,该过程可以按计划的间隔发布操作:
dotnet new worker -n [NameOfYourApp] -o ./[NameOfYourApp]dotnet add package coravelProgram.cs : using Coravel ;
Console . OutputEncoding = System . Text . Encoding . UTF8 ;
var builder = Host . CreateApplicationBuilder ( args ) ;
builder . Services . AddScheduler ( ) ;
var host = builder . Build ( ) ;
host . Services . UseScheduler ( s =>
{
s . Schedule ( ( ) => Console . WriteLine ( "It's alive! ?" ) ) . EverySecond ( ) ;
} ) ;
host . Run ( ) ;dotnet run就是这样 - 愉快的编码!
如果您正在使用实体框架构建.NET应用程序,则可能需要研究Coravel Pro。它是一种管理面板和工具,可以使维护和管理.NET应用程序变得轻而易举!
Hangfire已经存在了一段时间 - 在Modern .Net(核心)之前。这是一个很棒的工具,具有Coravel没有的大量功能。值得注意的是:持续的队列,重试机制,支持许多存储驱动器等。
但是,Hangfire Still(截至2023年3月)并不在本地支持真正的async/await (此处和此处)。这意味着例如,在Web应用程序中使用HangFire在使用执行I/O操作的线程时不会像它那样有效。
Coravel是用现代的C#和.NET原语制成的,例如async/await和.NET的内置依赖注入实用程序。这意味着Coravel可以更易于配置,并且对于您的Web应用程序需要响应传入的HTTP请求需要 /不会有效率。
石英是一个较旧的Java库,移植到.NET。它仍然没有很好地进入现代.NET依赖注入工具。有些人认为Coravel的API更为简洁,可以理解。
例如,将其文档中的样本与Coravel的工作方式进行比较(例如,您不需要了解如何“启动”和“停止” Coravel的调度程序,但是您必须与石英调度程序手动合作)。
不,至少,还没有。
Coravel过程中排队的项目中的内存。当您的应用程序下降时,在处理所有项目之前,应用程序不允许关闭。
Coravel的哲学是与其他.NET原始词合作,这意味着使用其他库很容易。
Coravel不支持内部的重试机制,因为我非常小心,不要用不需要的东西来膨胀Coravel。我想将Coravel专注于最擅长的事情(例如“我需要工作计划,排队等,而无需额外的基础架构和复杂的配置”)。
例如,您可以在Incocables中使用Polly进行重试。有些人将配置一个IInvocable内置的可撤回的基类。
否。但是,可以通过使用经过战斗测试的分布式锁定库(如Distributedlock)来实现这一点。您可能会创建一个Invocable的Invoke() :
public class TestInvocable : IInvocable
{
private ApplicationDbContext _context ;
private IDistributedLockProvider _distributedlock ;
public TestInvocable ( ApplicationDbContext context , IDistributedLockProvider distributedlock )
{
this . _context = context ;
this . _distributedlock = distributedlock ;
}
public async Task Invoke ( )
{
await using ( await this . _distributedlock . AcquireAsync ( ) )
{
await this . _context . Test . AddAsync ( new TestModel ( ) { Name = "test name" } ) ;
await this . _context . SaveChangesAsync ( ) ;
}
}
}