停止方法执行

时间:2011-10-27 20:57:12

标签: c# compact-framework

我有一个类试图从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方法中做到这一点最好。

2 个答案:

答案 0 :(得分:0)

我能想到两件事。您可以确保TResult是具有Boolean字段的接口类型,该字段表示成功请求(IsSuccessful或IsValid等)。如果您无法修改TResult,则另一个选项是在try方法上使用Out参数来传递另一个值。

答案 1 :(得分:0)

无法停止执行方法。首先想到的是抛出异常并从调用方法中捕获它。

请记住,您不应该依赖异常来控制流程......但如果您真的无法重写调用方法,这可能是您唯一的选择。< / p>

另一个选项可能是让您的返回结果设置一个标志(通过接口)来通知调用者它已成功完成。