我应该在nopcommerce任务中使用Thread.Sleep或Task.Delay吗?

时间:2016-08-30 12:42:42

标签: nopcommerce

我正在编写一个插件中的任务来进行nopcommerce。任务必须从网站(https://data.icecat.biz/export/level4/)下载目录。如果由于某种原因下载失败,我希望我的程序等待一分钟再重试几次。

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。

2 个答案:

答案 0 :(得分:3)

我认为重试操作的最佳选择是System.Threading.Timer,你不需要担心nopcommerce线程行为,你让.net来管理线程,你可以使用类似的东西:

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

答案 1 :(得分:1)

Icecat是一个非常大的目录,所以我对你遇到麻烦并不感到惊讶。

您可以将算法更改为:

  • 将您的任务设置为每隔15分钟运行一次。

  • 尝试在任务开始时获取锁定;如果锁定,那么前一个任务仍在运行,只需返回而不进行处理。

  • 如果未执行锁定,请获取锁定,并检查上次进程是否结束。如果已经过了足够的时间,请运行您的任务(1天,1周或下载之间可能需要的时间)。您需要在最近的某个时间存储:您可以使用自己的一个表,或者自定义设置就可以了。

  • 如果任务成功,请保存新的结束时间。

  • 解锁。

也许您想为重试次数添加限制。还有一些记录。

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