停止方法执行
本文关键字:执行 方法 | 更新日期: 2023-09-27 18:12:31
我有一个类,试图从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 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
我当然可以检查返回值是否为空,比如:
someValue = retry.Try(()=>webService.method(),maxRetries));
if (someValue == null)
return;
但是这将意味着在代码中有很多变化,我想避免它,如果我能从Try方法中做到这一点,那将是最好的。
我能想到两件事。您可以确保TResult
是具有Boolean
字段的接口类型,该字段表示成功请求(IsSuccessful或IsValid等)。如果不能修改TResult
,另一种选择是在try方法上使用Out
参数来传递另一个值。
没有办法直接停止方法的执行。首先想到的是抛出一个异常并从调用方法中捕获它。
请记住,你不应该依赖异常来控制流。但是如果你真的不能重写调用方法,这可能是你唯一的选择。
另一种选择可能是让返回的结果设置一个标志(通过接口)来通知调用者它已成功完成。