ExponentialRetryPolicy.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System;
  2. using System.Threading.Tasks;
  3. using UnityEngine.Purchasing.Stores.Util;
  4. namespace UnityEngine.Purchasing
  5. {
  6. class ExponentialRetryPolicy : IRetryPolicy
  7. {
  8. int m_BaseRetryDelay;
  9. int m_MaxRetryDelay;
  10. int m_ExponentialFactor;
  11. public ExponentialRetryPolicy(int baseRetryDelay = 1000, int maxRetryDelay = 30 * 1000, int exponentialFactor = 2)
  12. {
  13. m_BaseRetryDelay = baseRetryDelay;
  14. m_MaxRetryDelay = maxRetryDelay;
  15. m_ExponentialFactor = exponentialFactor;
  16. }
  17. public void Invoke(Action<Action> actionToTry)
  18. {
  19. var currentRetryDelay = m_BaseRetryDelay;
  20. actionToTry(Retry);
  21. async void Retry()
  22. {
  23. await WaitAndRetry();
  24. }
  25. async Task WaitAndRetry()
  26. {
  27. await Task.Delay(currentRetryDelay);
  28. currentRetryDelay = AdjustDelay(currentRetryDelay);
  29. actionToTry(Retry);
  30. }
  31. }
  32. int AdjustDelay(int delay)
  33. {
  34. return Math.Min(m_MaxRetryDelay, delay * m_ExponentialFactor);
  35. }
  36. }
  37. }