2016-08-30 3 views
3

私は、nopcommerceへのプラグインでタスクをコーディングしています。タスクは、Webサイトからカタログをダウンロードする必要があります(https://data.icecat.biz/export/level4/)。ダウンロードが何らかの理由で失敗した場合、私のプログラムは1分間待ってからもう一度2,3回試して欲しい。nopcommerceタスクでThread.SleepまたはTask.Delayを使用する必要がありますか?

例えば

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週間、またはダウンロードの間に必要な時間)。あなたは最後の時間をどこかに保存する必要があります:あなた自身のテーブルの1つを使うことができます。あるいは、カスタム設定がうまくいくでしょう。

  • タスクが成功した場合は、新しい終了時刻を保存します。

  • ロックを解除します。

再試行した回数に制限を加えることをお勧めします。そしていくつかの伐採。

// Sample pseudocode 
if (Monitor.TryEnter(lockObj)) { 
    try { 
     if (EnoughTimeHasPassed()) 
     { 
     DownloadIcecat(); 
     SaveLastFinishingTime(now); 
     } 
    } 
    finally { Monitor.Exit(lockObj); } 
} 
関連する問題