我有一个类试图从Web服务中获取信息几次:
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)'用户可以选择是否要继续尝试从Web服务获取数据或取消。 我想在用户取消并停止执行调用上述方法的方法时打开新表单。我不能只返回null或new对象,因为运行此retrier的方法将继续工作,并且在许多情况下会导致问题。
所以基本上看起来像这样:
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方法中做到这一点最好。
答案 0 :(得分:0)
我能想到两件事。您可以确保TResult
是具有Boolean
字段的接口类型,该字段表示成功请求(IsSuccessful或IsValid等)。如果您无法修改TResult
,则另一个选项是在try方法上使用Out
参数来传递另一个值。
答案 1 :(得分:0)
无法停止执行方法。首先想到的是抛出异常并从调用方法中捕获它。
请记住,您不应该依赖异常来控制流程......但如果您真的无法重写调用方法,这可能是您唯一的选择。< / p>
另一个选项可能是让您的返回结果设置一个标志(通过接口)来通知调用者它已成功完成。