Менің веб-қызметтен ақпаратты бірнеше рет алуға тырысатын сынып бар:
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
}
}
}
Енді «егер (numTries == maxRetries)» пайдаланушысы веб-қызметтен деректерді алуды жалғастырғысы немесе бас тартқысы келсе, оны таңдай алады.
Пайдаланушы жоғары әдіс деп аталатын әдісті орындаудан бас тартқан және тоқтатқан кезде жаңа пішінді ашқым келеді. Мен тек нөлдік немесе жаңа нысанды қайтара алмаймын, себебі бұл ретерді іске қосатын әдіс жұмысын жалғастырады және көптеген жағдайларда проблемаларды тудырады.
Осылайша, негізінен бұл көрінеді:
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
Әрине, қайтарылған мән нөлге тең болғанын тексере аламын:
someValue = retry.Try(()=>webService.method(),maxRetries));
if (someValue == null)
return;
Бірақ бұл кодексте көптеген өзгерістерді білдіріп, оны болдырмауды қалаймын, және мен оны Try әдісінен істей аламын.