重试

对于一些可能会出现失败的操作,我们可以采用重试策略来执行,

例如:

  • 读写文件
  • 发送HTTP请求



示例代码

示例代码

public void 发送HTTP请求_支持重试()
{
    // 如果发生异常,最多重试5次,间隔 500 毫秒
    Retry retry = Retry.Create(5, 500);

    string text = new HttpOption {
        Url = "http://www.fish-test.com/abc.aspx",
        Data = new { id = 2, name = "abc" }
    }.GetResult(retry);
}

public void 发送HTTP请求_定制重试策略()
{
    Retry retry =
        Retry.Create(100, 2000)     // 重试 100 次,间隔 2 秒
        .Filter<WebException>();    // 仅当出现 WebException 异常时才重试。

    string text = new HttpOption {
        Url = "http://www.fish-test.com/abc.aspx",
        Data = new { id = 2, name = "abc" }
    }.GetResult(retry);
}

public void 读取文件_最大重试10次()
{
    string text =
        Retry.Create(100, 0) // 指定重试10,使用默认的重试间隔时间,且不分辨异常类型(有异常就重试)
            .Run(() => {
                return System.IO.File.ReadAllText(@"c:\abc.txt", Encoding.UTF8);
            });
}



工具类

ClownFish提供4个封装的工具可直接使用。

    /// <summary>
    /// 提供一些与 System.IO.File 相同签名且功能相同的工具方法,
    /// 差别在于:当出现IOException时,这个类中的方法支持重试功能。
    /// </summary>
    public static class RetryFile
    /// <summary>
    /// 提供一些与 System.IO.Directory 相同签名且功能相同的工具方法,
    /// 差别在于:当出现IOException时,这个类中的方法支持重试功能。
    /// </summary>
    public static class RetryDirectory
/// <summary>
/// 定义HttpClient的扩展方法的工具类
/// </summary>
public static class HttpOptionExtensions
{
	/// <summary>
	/// 根据指定的HttpOption参数,用【同步】方式发起一次HTTP请求
	/// </summary>
	/// <param name="option">HttpOption的实例,用于描述请求参数</param>
	/// <param name="retry">提供一个Retry实例,用于指示如何执行重试。如果此参数为NULL则不启用重试</param>
	/// <returns>返回服务端的调用结果,并转换成指定的类型</returns>
	/// <exception cref="RemoteWebException"></exception>
	public static string GetResult(this HttpOption option, Retry retry = null)


	/// <summary>
	/// 根据指定的HttpOption参数,用【异步】方式发起一次HTTP请求
	/// </summary>
	/// <param name="option">HttpOption的实例,用于描述请求参数</param>
	/// <param name="retry">提供一个Retry实例,用于指示如何执行重试。如果此参数为NULL则不启用重试</param>
	/// <returns>返回服务端的调用结果,并转换成指定的类型</returns>
	/// <exception cref="RemoteWebException"></exception>
	public async static Task<string> GetResultAsync(this HttpOption option, Retry retry = null)


	/// <summary>
	/// 根据指定的HttpOption参数,用【同步】方式发起一次HTTP请求
	/// </summary>
	/// <typeparam name="T">返回值的类型参数</typeparam>
	/// <param name="option">HttpOption的实例,用于描述请求参数</param>
	/// <param name="retry">提供一个Retry实例,用于指示如何执行重试。如果此参数为NULL则不启用重试</param>
	/// <returns>返回服务端的调用结果,并转换成指定的类型</returns>
	/// <exception cref="RemoteWebException"></exception>
	public static T GetResult<T>(this HttpOption option, Retry retry = null)


	/// <summary>
	/// 根据指定的HttpOption参数,用【异步】方式发起一次HTTP请求
	/// </summary>
	/// <typeparam name="T">返回值的类型参数</typeparam>
	/// <param name="option">HttpOption的实例,用于描述请求参数</param>
	/// <param name="retry">提供一个Retry实例,用于指示如何执行重试。如果此参数为NULL则不启用重试</param>
	/// <returns>返回服务端的调用结果,并转换成指定的类型</returns>
	/// <exception cref="RemoteWebException"></exception>
	public async static Task<T> GetResultAsync<T>(this HttpOption option, Retry retry = null)

}
/// <summary>
/// 创建发出HTTP请求时的重试策略工具类
/// </summary>
public static class HttpRetry
{
	/// <summary>
	/// 获取用于发送HTTP请求的重试策略。
	/// 当发生 “网络不通” 或者 “HTTP 502,503” 时,最大重试 7 次,每次间隔 1000 毫秒
	/// </summary>
	/// <returns></returns>
	public static Retry Create()
}