Retry.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. namespace Aitex.Core.Utilities
  7. {
  8. /// <summary>
  9. /// 用于简化多次尝试执行动作,仅判断一次成功或者错误.类似于Trigger,但是增加了上升沿,下降沿两种逻辑
  10. /// </summary>
  11. public class Retry
  12. {
  13. /// <summary>
  14. /// 第一次触发成功
  15. /// </summary>
  16. public bool IsSucceeded { get; set; }
  17. /// <summary>
  18. /// 第一次触发失败
  19. /// </summary>
  20. public bool IsErrored { get; set; }
  21. bool _result = false;
  22. int _retryTime = -1;
  23. private Guid _guid;
  24. public Guid ClientGuid
  25. {
  26. get {
  27. return _guid;
  28. }
  29. set
  30. {
  31. _guid = value;
  32. }
  33. }
  34. /// <summary>
  35. /// 当前执行结果
  36. /// </summary>
  37. public bool Result
  38. {
  39. set
  40. {
  41. if (value)
  42. {
  43. IsSucceeded = !_result;
  44. IsErrored = false;
  45. }
  46. else
  47. {
  48. IsErrored = (_result || _retryTime == -1);
  49. IsSucceeded = false;
  50. }
  51. _result = value;
  52. _retryTime = ++_retryTime % 100;
  53. }
  54. get
  55. {
  56. return _result;
  57. }
  58. }
  59. public Retry()
  60. {
  61. }
  62. public void Do(Func<bool> function, int time)
  63. {
  64. for (int i = 0; i < time; i++)
  65. {
  66. if (function())
  67. Result = true;
  68. Thread.Sleep(10);
  69. }
  70. Result = false;
  71. }
  72. }
  73. }