Повторить вызов службы ТОЛЬКО ОДИН РАЗ в случае сбоя службы логики

Итак, у меня есть функция, которая вызывает веб-службу, которая возвращает INT, указывающий на успех или различные типы сбоев, которые могли произойти. После того, как я получаю результат от службы, я запускаю оператор switch и действую соответственно в зависимости от того, что произошло во время выполнения службы.

private void Example()
{

int Result = ExecuteWebService();

switch(Result)
{
case 0:
//no errors
NoErrorsLogic();
break;
case 1:
// manual retry 
ManualRetryLogic();
break;
case 2:
//  validation error
ValidationErrorLogic();
break;
default:
// Run time error occurred
LogicOptionD();
// At this point I want to to call the service again ONCE just to see if it will succeed
break;
}

}

Как правило, я бы просто добавил вызов функции, чтобы она вызывала службу и снова и снова просматривала результаты, но я не хочу, чтобы она работала непрерывно, пока служба не завершится успешно. В варианте по умолчанию я просто хочу заставить его «повторить» вызов службы ОДИН РАЗ, а ЗАТЕМ соответствующим образом обработать результаты.

Любые идеи?


person user234702    schedule 21.12.2010    source источник


Ответы (2)


Вы всегда можете сделать:

private void Example(bool retry = true)
{


....
default:

if(retry)
{
  Example(false);
}
break;
}

Просто добавьте параметр, и в случае сбоя функция вызовет саму себя. Вы передаете значение false для параметра, который сообщает функции, что если она снова выйдет из строя, ничего не делать.

В C# 4.0 Example(bool retry = true) вы можете установить значение по умолчанию, поэтому вам не нужно беспокоиться о том, что ваш существующий код не имеет уже установленного истинного значения. В версии 3.5 или ниже просто создайте перегруженный метод с параметром и без него. Тот, у кого нет, просто вызывает тот, у кого так:

Example()
{
   Example(true);
}
person kemiller2002    schedule 21.12.2010

Хотя я согласен с подходом Кевина, вот еще один:

bool success = false;
bool retry = true;
while (!success)
{
    success = true;
    int Result = ExecuteWebService();

    switch(Result)
    {
    case 0:
        //no errors
        NoErrorsLogic();
        break;
    case 1:
        // manual retry 
        ManualRetryLogic();
        break;
    case 2:
        //  validation error
        ValidationErrorLogic();
        break;
    default:
        // Run time error occurred
        LogicOptionD();
        success = !retry;
        retry = false;
        break;
    }

}

Это гарантирует, что если в примере есть другая логика, она все равно будет вызвана один раз, и вам не нужно будет размещать вызов службы и код обработки ответа в отдельный метод (хотя я бы рекомендовал это сделать).

person Michael Sagalovich    schedule 21.12.2010