CTaskAwaitBuffer.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Fort23.Core
  5. {
  6. public class CTaskAwaitBuffer : IDisposable
  7. {
  8. private List<ICTaskResult> _cTasks = new List<ICTaskResult>();
  9. public ICTaskResult[] GetTask
  10. {
  11. get { return _cTasks.ToArray(); }
  12. }
  13. private int count;
  14. private CTask CTask;
  15. private bool _isWait;
  16. public void Clear()
  17. {
  18. _cTasks.Clear();
  19. _isWait = false;
  20. CTask = null;
  21. count = 0;
  22. }
  23. public void AddTask(ICTaskResult icTaskResult)
  24. {
  25. _cTasks.Add(icTaskResult);
  26. if (_isWait)
  27. {
  28. count++;
  29. AwaitTask(icTaskResult);
  30. }
  31. }
  32. public async CTask WaitAll()
  33. {
  34. _isWait = true;
  35. count += _cTasks.Count;
  36. if (count == 0)
  37. {
  38. return;
  39. }
  40. CTask = CTask.Create(false);
  41. ICTaskResult[] icTaskResults= _cTasks.ToArray();
  42. for (int i = 0; i < icTaskResults.Length; i++)
  43. {
  44. AwaitTask(icTaskResults[i]);
  45. }
  46. await CTask;
  47. }
  48. public async void AwaitTask(ICTaskResult icTaskResult)
  49. {
  50. await icTaskResult.AwaitTask();
  51. count--;
  52. _cTasks.Remove(icTaskResult);
  53. if (count <= 0 && _isWait)
  54. {
  55. _isWait = false;
  56. CTask cta = CTask;
  57. if (_cTasks != null)
  58. {
  59. _cTasks.Clear();
  60. }
  61. count = 0;
  62. cta.SetResult();
  63. }
  64. }
  65. public void Dispose()
  66. {
  67. _cTasks.Clear();
  68. CTask = null;
  69. _isWait = false;
  70. }
  71. }
  72. }