
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 ( ) ;
}
}
}