AsyncOperationBase.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. namespace YooAsset
  6. {
  7. public abstract class AsyncOperationBase : IEnumerator
  8. {
  9. // 用户请求的回调
  10. private Action<AsyncOperationBase> _callback;
  11. /// <summary>
  12. /// 状态
  13. /// </summary>
  14. public EOperationStatus Status { get; protected set; } = EOperationStatus.None;
  15. /// <summary>
  16. /// 错误信息
  17. /// </summary>
  18. public string Error { get; protected set; }
  19. /// <summary>
  20. /// 处理进度
  21. /// </summary>
  22. public float Progress { get; protected set; }
  23. /// <summary>
  24. /// 是否已经完成
  25. /// </summary>
  26. public bool IsDone
  27. {
  28. get
  29. {
  30. return Status == EOperationStatus.Failed || Status == EOperationStatus.Succeed;
  31. }
  32. }
  33. /// <summary>
  34. /// 完成事件
  35. /// </summary>
  36. public event Action<AsyncOperationBase> Completed
  37. {
  38. add
  39. {
  40. if (IsDone)
  41. value.Invoke(this);
  42. else
  43. _callback += value;
  44. }
  45. remove
  46. {
  47. _callback -= value;
  48. }
  49. }
  50. /// <summary>
  51. /// 异步操作任务
  52. /// </summary>
  53. public Task Task
  54. {
  55. get
  56. {
  57. if (_taskCompletionSource == null)
  58. {
  59. _taskCompletionSource = new TaskCompletionSource<object>();
  60. if (IsDone)
  61. _taskCompletionSource.SetResult(null);
  62. }
  63. return _taskCompletionSource.Task;
  64. }
  65. }
  66. internal abstract void Start();
  67. internal abstract void Update();
  68. internal void Finish()
  69. {
  70. Progress = 1f;
  71. _callback?.Invoke(this);
  72. if (_taskCompletionSource != null)
  73. _taskCompletionSource.TrySetResult(null);
  74. }
  75. #region 异步编程相关
  76. bool IEnumerator.MoveNext()
  77. {
  78. return !IsDone;
  79. }
  80. void IEnumerator.Reset()
  81. {
  82. }
  83. object IEnumerator.Current => null;
  84. private TaskCompletionSource<object> _taskCompletionSource;
  85. #endregion
  86. }
  87. }