重试
对于一些可能会出现失败的操作,我们可以采用重试策略来执行,
例如:
- 读写文件
- 发送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()
}