我有一個webapi,用於以隊列方式處理報表。是應用程序採取的步驟如下:如何在ASP.NET Web API中排列後臺任務
- 接收內容
- 內容映射到對象,並將其放置到隊列
- 輪詢在隊列中的一個隊列中的待處理的物品
- 過程項同時
我想使用實體框架來創建排隊的項目,如數據庫:
public class EFBatchItem
{
[Key]
public string BatchId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateCompleted { get; set; }
public string BatchItem { get; set; }
public BatchStatus Status { get; set; }
}
我的問題是否有一種更有效的方法,使用NServiceBus,BlockingCollection或ConcurrentQeueue,而不是一直輪詢數據庫並逐一提取未決項目?我以前沒有用過隊列。
一個想法是創建一個任務隊列,並在一個單獨的線程處理所有未完成的任務。有點類似Most efficient way to process a queue with threads但我想確保我走的是最有效的路線。
編輯: 我在這裏有一個大問題是向用戶顯示進度的最佳方式。一旦用戶提交內容,他將被帶到一個新頁面,並可以通過批次標識符查看狀態。需要MSMQ還是NServiceBus以通知用戶?這似乎是REquest/Acknowledge/Push範例的變體?
我的解決方案將是一個'周圍,你寫入數據庫的代碼部分lock'聲明。 – efkah
感謝您的提示 - 沒有想到這一點,以後可能會導致很多問題:)有關排隊方法的任何想法?我應該打擾嘗試一個BlockingCollection,或只是恆定的數據庫輪詢?通過快速編輯更新了問題 – appsecguy