请选择 进入手机版 | 继续访问电脑版

[C#教程] C#非常 实行 重试的实现方法

[复制链接]
查看164 | 回复44 | 2021-9-12 13:09:03 | 显示全部楼层 |阅读模式

一 模式先容

重试模式,是应用在非常 处理中,发生非常 的时间 ,可以或许 对业务程序举行 重新调用,在现实 中,可以使用 Polly提供稳固 ,简单的用法,本身 实现紧张 是对模式的一种相识 。

二 模式实现

  1. public class RetryPattern
  2. {
  3. /**
  4. * 重试模式可以用Polly替代
  5. * 自己实现一种模式
  6. */
  7. #region 构造函数
  8. public RetryPattern()
  9. {
  10. }
  11. #endregion 构造函数
  12. #region 变量
  13. private uint MaxTryCount; // 最大重试次数
  14. private uint CurrentTryCount; // 当前重试的次数
  15. private bool RunResult = true; // 执行结果
  16. #endregion 变量
  17. #region 方法
  18. #region 设置最大重试次数
  19. public void SetMaxCount(uint tryCount)
  20. {
  21. // 校验
  22. if (tryCount == 0) throw new ArgumentException("重试次数不能为0");
  23. MaxTryCount = tryCount;
  24. }
  25. #endregion 设置最大重试次数
  26. #region 是否需要重试
  27. public bool IsRetry()
  28. {
  29. if (RunResult || CurrentTryCount == MaxTryCount)
  30. return false;
  31. else
  32. {
  33. RunResult = true;
  34. return true;
  35. }
  36. }
  37. #endregion 是否需要重试
  38. #region 获取当前重试次数
  39. public uint GetCurrentTryCount()
  40. {
  41. return CurrentTryCount + 1;
  42. }
  43. #endregion 获取当前重试次数
  44. #region 重试
  45. public void RetryHandle()
  46. {
  47. RunResult = false;
  48. CurrentTryCount++;
  49. }
  50. #endregion 重试
  51. #endregion 方法
  52. }
复制代码

ps:下面通过代码看下C# 非常 重试策略

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Polly;
  11. using Polly.Bulkhead;
  12. using Polly.CircuitBreaker;
  13. using Polly.Fallback;
  14. using Polly.NoOp;
  15. using Polly.Registry;
  16. using Polly.Retry;
  17. using Polly.Timeout;
  18. using Polly.Utilities;
  19. using Polly.Wrap;
  20. using System.Net.Http;
  21. namespace CircuitBreak_Test
  22. {
  23. public partial class Form1 : Form
  24. {
  25. public Form1()
  26. {
  27. InitializeComponent();
  28. }
  29. private void button1_Click(object sender, EventArgs e)
  30. {
  31. try
  32. {
  33. var retryTwoTimesPolicy =
  34. Policy
  35. .Handle<DivideByZeroException>()
  36. .Retry(3, (ex, count) =>
  37. {
  38. Console.WriteLine("执行失败! 重试次数 {0}", count);
  39. Console.WriteLine("异常来自 {0}", ex.GetType().Name);
  40. });
  41. retryTwoTimesPolicy.Execute(() =>
  42. {
  43. Compute();
  44. });
  45. }
  46. catch (DivideByZeroException e1)
  47. {
  48. Console.WriteLine($"Excuted Failed,Message: ({e1.Message})");
  49. }
  50. Policy policy = Policy.Handle<TimeoutException>()
  51. .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(5), (exception, retryCount) =>
  52. {
  53. //logger.Error(exception);
  54. string xx = "";
  55. });
  56. var result = policy.ExecuteAsync(() => Test());
  57. Policy _circuitBreakerPolicy = Policy
  58. .Handle<HttpRequestException>()
  59. .Or<TimeoutRejectedException>()
  60. .Or<TimeoutException>()
  61. .CircuitBreakerAsync(
  62. exceptionsAllowedBeforeBreaking: 5,
  63. durationOfBreak: new TimeSpan(),
  64. onBreak: (ex, breakDelay) =>
  65. {
  66. },
  67. onReset: () => { },
  68. onHalfOpen: () => { }
  69. );
  70. var fallBackPolicy =
  71. Policy<string>
  72. .Handle<Exception>()
  73. .Fallback("执行失败,返回Fallback");
  74. var fallBack = fallBackPolicy.Execute(() =>
  75. {
  76. throw new Exception();
  77. });
  78. Console.WriteLine(fallBack);
  79. }
  80. static int Compute()
  81. {
  82. var a = 0;
  83. return 1 / a;
  84. }
  85. private static async Task Test()
  86. {
  87. using (HttpClient httpClient = new HttpClient())
  88. {
  89. var response = httpClient.GetAsync("http://news1.cnblogs.com/Category/GetCategoryList?bigCateId=11&loadType=0").Result;
  90. await response.Content.ReadAsStringAsync();
  91. }
  92. }
  93. }
  94. }
复制代码

到此这篇关于C#非常 实行 重试的一种实现方法的文章就先容 到这了,更多相干 C#非常 重试内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 我心永恒760 | 2021-9-14 12:29:46 | 显示全部楼层
admin楼主内心很强大!
回复

使用道具 举报

avatar 山东大鲤鱼 | 2021-9-14 14:20:35 | 显示全部楼层
admin楼主主机很热情啊!
回复

使用道具 举报

avatar 明功 | 2021-9-14 22:52:31 | 显示全部楼层
看帖、回帖、拿分、走人
回复

使用道具 举报

avatar 冷艳林壳 | 2021-9-16 03:52:42 | 显示全部楼层
admin楼主病的不轻啊!
回复

使用道具 举报

avatar 直子的爱本 | 2021-9-17 09:06:49 | 显示全部楼层
对牛弹琴的人越来越多了!
回复

使用道具 举报

avatar 兴冲冲丈 | 2021-9-20 07:57:40 | 显示全部楼层
admin楼主今年多大了?
回复

使用道具 举报

avatar 无人岛屿颈 | 2021-9-21 10:19:41 | 显示全部楼层
admin楼主是一个典型的文艺青年啊!
回复

使用道具 举报

avatar yhzdmb342 | 2021-9-27 01:36:40 | 显示全部楼层
每次看到admin楼主的帖子都有惊吓!
回复

使用道具 举报

avatar 狂风974 | 2021-9-30 03:09:16 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则