#c# #compact-framework
#c# #compact-framework
Вопрос:
У меня есть класс, который несколько раз пытается получить информацию из веб-службы:
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)’ пользователь сможет выбрать, хочет ли он продолжить попытки получения данных из веб-службы или отменить.
Я хочу просто открыть новую форму, когда пользователь отменит и остановит выполнение метода, который вызвал указанный выше метод. Я не могу просто вернуть null или new object, потому что метод, который запускает этот ретриер, будет продолжать работать и во многих случаях вызывать проблемы.
Итак, в основном это выглядит так:
someValue = retry.Try(() => webService.method(),maxRetries));
//if user canceled after app wasn't able to get data stop execution as already another form is opened
Я мог бы, конечно, проверить, было ли возвращаемое значение null, например:
someValue = retry.Try(()=>webService.method(),maxRetries));
if (someValue == null)
return;
Но это означало бы много изменений в коде, и я хочу избежать этого, и было бы лучше, если бы я мог сделать это из метода Try.
Ответ №1:
Я могу думать о двух вещах. Вы могли бы убедиться, что TResult
это тип интерфейса, в котором есть Boolean
поле, представляющее успешный запрос (issucccessful или isValid и т. Д.). Если вы не можете изменить TResult
, другой вариант — использовать Out
параметр в вашем методе try для передачи другого значения.
Ответ №2:
Невозможно просто остановить выполнение метода. Первое, что приходит на ум, это создать исключение и перехватить его из вызывающего метода.
Имейте в виду, однако, что вы никогда не должны полагаться на исключения для управления таким потоком .. но если вы действительно не можете переписать вызывающий метод, это может быть вашим единственным вариантом.
Другой вариант, возможно, заключается в том, чтобы ваш возвращаемый результат установил флаг (через интерфейс), чтобы уведомить вызывающего абонента об успешном завершении.