Что если сервис не работает в течение 2-3 часов, он рекурсивно вызовет метод, и размер стека в памяти увеличится. Есть ли другой подход?
Я думаю, вы спрашиваете, потому что вы уже чувствуете, что может быть какой-то другой способ улучшить то, что у вас есть; я думаю, вы ищете какой-то стандарт.
Если это так, я бы порекомендовал Google Показатель экспоненциального отката , здесь применительно к вызовам Google Maps.
Идея состоит в том, чтобы ввести задержку между последующими вызовами веб-службы, увеличить в случае повторных сбоев.
Простое изменение будет:
public List<MyData> GetMyData()
{
List<MyData> data = null;
int delayMilliseconds = 100;
bool waitingForResults = true;
while (waitingForResults)
{
try
{
data = GetOrCreateChannel().GetMyData();
waitingForResults = false; // if this executes, you've got your data and can exit
}
catch (Exception ex)
{
_log.error(ex);
FixedBrokenService();
Thread.Sleep(delayMilliseconds); // wait before retrying
delayMilliseconds = delayMilliseconds * 2; // increase your delay
}
}
return data;
}
Таким образом, вам также не придется иметь дело с рекурсией; не забудьте добавить
using System.Threading;
наверх.
Поскольку вы упомянули WPF, мы могли бы принять предложение Джероена и
ждать в другом потоке : это означает, что ваш WPF
GUI не будет заморожен , пока вы пытаетесь переподключиться, но это будет включен и, возможно, отображает счетчик, сообщение ожидания или что-то в этом роде (например, «Повторное подключение через x секунд»).
Это требует изменения второй строки на последнюю, то есть Thread.Sleep(delayMilliseconds);
на Wait(delayMilliseconds);
и добавления этих двух методов ниже GetMyData
:
private async static Task Wait(int delayMilliseconds)
{
await WaitAsync(delayMilliseconds);
}
private static Task WaitAsync(int delayMilliseconds)
{
Thread.Sleep(delayMilliseconds);
return new Task(() => { });
}