停止方法执行

本文关键字:执行 方法 | 更新日期: 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参数来传递另一个值。

没有办法直接停止方法的执行。首先想到的是抛出一个异常并从调用方法中捕获它。

请记住,你不应该依赖异常来控制流。但是如果你真的不能重写调用方法,这可能是你唯一的选择。

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