2016-08-30 6 views
3

Я кодирую задачу в плагине для nopcommerce. Задача должна загрузить каталог с веб-сайта (https://data.icecat.biz/export/level4/). Если загрузка по какой-то причине не выполняется, я хочу, чтобы моя программа подождала минуту, а затем повторите попытку пару раз.Должен ли я использовать Thread.Sleep или Task.Delay в задаче nopcommerce?

например

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

Icecat - довольно большой каталог, поэтому я не удивлен, что у вас проблемы с ним.

Вы можете изменить свой алгоритм на что-то вроде:

  • Установите задание для запуска через короткие промежутки времени, например, через каждые 15 минут.

  • Постарайтесь приобрести замок в начале задания; если блокировка выполнена, предыдущая задача все еще выполняется, просто вернитесь без обработки.

  • Если замок не снят, приобретите замок и проверьте последний раз, когда процесс закончился. Если прошло достаточно времени, запустите свою задачу (1 день, 1 неделя или количество времени, которое может потребоваться между загрузками). Вам нужно сохранить последний раз где-нибудь: вы можете использовать одну из своих собственных таблиц, или пользовательская настройка будет очень удобной.

  • Если задача была успешной, сохраните новое время окончания.

  • Отпустите замок.

Возможно, вы хотите добавить ограничение к моменту повтора попыток. И некоторые регистрации.

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

 Смежные вопросы

  • Нет связанных вопросов^_^