Остановить выполнение метода - PullRequest
1 голос
/ 28 октября 2011

У меня есть класс, который пытается получить информацию из веб-службы несколько раз:

public TResult Try(Func<TResult> func, int maxRetries)
{
    TResult returnValue = default(TResult);
    int numTries = 0;
    bool succeeded = false;

    while (numTries < maxRetries)
    {
        try
        {
            returnValue = func();
            succeeded = true;
        }
        catch (Exception ex)
        {
            Log(ex,numTries);
        }
        finally
        {
            numTries++;
        }
        if (succeeded)
        {
            return returnValue;
        }
        else
        {
            if (numTries == maxRetries)
            {
                 //ask user what to do
            }
        }
  }

Теперь после 'if (numTries == maxRetries)' пользователь сможет выбрать, будет ли он продолжать попыткиполучить данные из веб-сервиса или отменить.Я хочу просто открыть новую форму, когда пользователь отменяет и прекращает выполнение метода, который вызвал метод выше.Я не могу просто вернуть нулевой или новый объект, потому что метод, который запускает этот ретривер, продолжит работать и во многих случаях вызывает проблемы.

Так что в основном это выглядит так:Я, конечно, мог бы проверить, было ли возвращенное значение нулевым, например:

someValue = retry.Try(()=>webService.method(),maxRetries));
if (someValue == null) 
return;

Но это означало бы множество изменений в коде, и я хочу избежать этого, и было бы лучше, если бы я мог сделать это из Tryспособ.

Ответы [ 2 ]

0 голосов
/ 28 октября 2011

Нет способа просто остановить выполнение метода. Первое, что приходит на ум, - это выбросить исключение и перехватить его из вызывающего метода.

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

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

0 голосов
/ 28 октября 2011

Я могу думать о двух вещах. Вы можете убедиться, что TResult имеет тип интерфейса, который имеет поле Boolean, которое представляет успешный запрос (IsSuccessful или IsValid и т. Д.). Если вы не можете изменить TResult, другой вариант - использовать параметр Out в вашем методе try для передачи другого значения.

...