Я использую некоторые запросы REST, используя Mono.Mac (3.2.3) для связи с сервером, и в качестве механизма повтора я спокойно пытаюсь дать действиям HTTP несколько попыток если они потерпят неудачу, или тайм-аут.Перезапуск задачи в фоновом режиме при возникновении определенных ошибок
У меня есть следующее:
var tries = 0;
while (tries <= ALLOWED_TRIES)
{
try
{
postTask.Start();
tries++;
if (!postTask.Wait(Timeout))
{
throw new TimeoutException("Operation timed out");
}
break;
} catch (Exception e) {
if (tries > ALLOWED_TRIES)
{
throw new Exception("Failed to access Resource.", e);
}
}
}
Если задача использует параметры родительского метода, например;
var postTask = new Task<HttpWebResponse>(() => {return someStuff(foo, bar);},
Task.Factory.CancellationToken,
Task.Factory.CreationOptions);
Проблема, кажется, что задача не хочет, чтобы снова запустить с postTask.Start()
после его завершения первого (и последующий отказ). Есть ли простой способ сделать это, или я неправильно использую задачи таким образом? Есть ли какой-то метод, который сбрасывает задачу в исходное состояние, или мне лучше использовать какую-либо фабрику?
Это предполагает C# 5.0, мне непонятно, что это вариант. – svick
@svick, то же самое можно сделать с помощью обратных вызовов 'ContinueWith', хотя код не будет таким читаемым. – Noseratio
@svick, вот [версия .NET 4.0] (http://stackoverflow.com/a/21346870/1768303), как учебное упражнение для меня, и я научился любить «асинхронный/ждущий» еще больше. – Noseratio