我正在编写一个插件中的任务来进行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。
答案 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); }
}