繁体   English   中英

c#或vb通用函数重试代码块n次

[英]c# or vb Generic function to retry code block n number of times

我正在尝试创建一个泛型函数,可以在该泛型函数中指定要调用的方法,以及在失败之前应尝试获得结果的次数。

就像是:

//3 stands for maximum number of times GetCustomerbyId should be called if it fails on first attempt.
var result = RetryCall(GetCustomerbyId(id),3);

其次,应根据调用的函数自动调整返回类型。

例如,我应该能够从以下两个函数中获取结果,一个返回字符串,另一个返回客户实体。

public static string GetCustomerFullNamebyId(int id){
    return dataContext.Customers.Where(c => c.Id.Equals(id)).SingleOrDefault().FullName;
}

public static Customer GetCustomerbyId(int id){
   return dataContext.Customers.Find(id);
}

这可能吗?

您可以执行以下操作:

public T Retry<T>(Func<T> getter, int count)
{
  for (int i = 0; i < (count - 1); i++)
  {
    try
    {
      return getter();
    }
    catch (Exception e)
    {
      // Log e
    }
  }

  return getter();
}

const int retryCount = 3;

Customer customer = Retry(() => GetCustomerByID(id), retryCount);
string customerFullName = Retry(() => GetCustomerFullNamebyId(id), retryCount);

问题是在前n次尝试期间出现异常时该怎么办? 我想您可以记录该异常,但是请注意,调用者将看不到该异常。

您还可以执行循环功能并设置一个变量,以查看尝试的次数是否与您实际希望执行的尝试次数相匹配。

    private static void DoSomeTask(int RetryCount)
    {
        int Count = 0;
        while (Count != RetryCount)
        {
            DoCustomerLookUp(); // or whatever you want to do
            Count++;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM