2016-08-30 30 views
3

我正在編寫一個插件nopcommerce任務。任務必須從網站下載目錄(https://data.icecat.biz/export/level4/)。如果由於某種原因下載失敗,我希望我的程序等待一分鐘,然後重試幾次。我應該在nopcommerce任務中使用Thread.Sleep或Task.Delay嗎?

e.g

while(notTiredOfWaiting) 
{ 
    try{ 
     // my download stuff here 
     return data; 
    } 
    catch(Exception e) 
    { 
     Thread.Sleep(60000); 
     // or 
     Task.Delay(60000); 
    } 
} 

我的問題是nopcommerce是某種黑盒,其啓動並運行我的任務。 「簡單」的解決方案是使用Thread.Sleep(),但我不知道是否有其他重要的進程在同一個線程上運行。我試過Task.Delay(),但它似乎並沒有在我的實現中工作。

我知道Thread.Sleep與Task.Delay()是SO上的熱門話題,但我要求的是nopCommerce中最佳實踐的具體答案。

編輯。

該任務正在使用IScheduleTaskService。

+0

你使用的是'IScheduleTaskService'嗎?或者你正在創建自己的任務計劃? – Max

+0

@ max。我使用IScheduleTaskService。 –

回答

3

我認爲對於重試操作的最佳選擇是System.Threading.Timer,你並不需要擔心nopcommerce線程行爲,你讓.NET來管理線程的東西,你可以使用類似:

void Retry(){ 
    if(notTiredOfWaiting) 
    { 
     var timer = new System.Threading.Timer((cb) => { Retry() }, null, 60000, 0); 
    } 
} 
1

此產品數據表是不是一個巨大的數字,因此我不爲您驚動您發表。

你可以你的算法更改爲類似:

  • 設置你的任務,在很短的間隔運行,例如每隔15分鐘。

  • 嘗試在任務開始時獲取鎖;如果執行了鎖定,則上一個任務仍在運行,只是返回而不進行處理。

  • 如果沒有進行鎖定,請獲取鎖定,並檢查最後一次過程是否結束。如果足夠的時間過去了,請運行您的任務(1天,1周或下載之間可能需要的時間)。您需要將最後一次存儲在某個地方:您可以使用自己的表中的一個表格,或者自定義設置可以做得很好。

  • 如果任務成功,則保存新的結束時間。

  • 解鎖。

也許您想爲重試次數添加限制。還有一些日誌。

// Sample pseudocode 
if (Monitor.TryEnter(lockObj)) { 
    try { 
     if (EnoughTimeHasPassed()) 
     { 
     DownloadIcecat(); 
     SaveLastFinishingTime(now); 
     } 
    } 
    finally { Monitor.Exit(lockObj); } 
} 
相關問題