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

Should I use Thread.Sleep or Task.Delay in a nopcommerce Task?

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

例如

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

我的问题是 nopcommerce 是某种黑盒子,它启动 运行 我的任务。 "easy"的解决方法是使用Thread.Sleep(),但是不知道在同一个线程上有没有其他重要的进程运行。我试过 Task.Delay(),但它似乎在我的实现中不起作用。

我知道 Thread.Sleep 与 Task.Delay() 是 SO 上的热门话题,但我想就 nopCommerce 中的最佳实践寻求具体答案。

编辑。

任务正在使用 IScheduleTaskService。

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

您可以将算法更改为:

  • 将您的任务设置为 运行,间隔较短,例如每 15 分钟一次。

  • 尝试在任务开始时获取锁;如果锁被拿了那么之前的任务仍然是运行ning,只是return没有处理。

  • 如果没有拿到锁,获取锁,查看进程最后一次结束的时间。如果已经过了足够的时间,运行 您的任务(1 天、1 周,或两次下载之间可能需要的时间)。您需要将最后一次存储在某个地方:您可以使用自己的表格之一,或者自定义设置就可以了。

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

  • 解除锁定

也许您想限制重试的次数。还有一些日志记录。

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

我认为重试操作的最佳选择是 System.Threading.Timer,您无需担心 nopcommerce 线程行为,让 .net 管理线程内容,您可以使用类似以下内容的方法:

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