Awaiter.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System;
  2. namespace XGame.Framework.Asyncs
  3. {
  4. public class Awaiter : IAwaiter
  5. {
  6. protected Action _continuation;
  7. public bool IsCompleted
  8. {
  9. get; protected set;
  10. }
  11. public void OnCompleted(Action continuation)
  12. {
  13. if (IsCompleted)
  14. {
  15. // 如果 await 开始时任务已经执行完成,则直接执行 await 后面的代码。
  16. // 注意,即便 _continuation 有值,也无需关心,因为报告结束的时候就会将其执行。
  17. continuation?.Invoke();
  18. }
  19. else
  20. {
  21. // 当使用多个 await 关键字等待此同一个 awaitable 实例时,此 OnCompleted 方法会被多次执行。
  22. // 当任务真正结束后,需要将这些所有的 await 后面的代码都执行。
  23. _continuation += continuation;
  24. }
  25. }
  26. public virtual void Completed(IAsync async)
  27. {
  28. if (IsCompleted) return;
  29. IsCompleted = true;
  30. _continuation?.Invoke();
  31. }
  32. public void GetResult() { }
  33. }
  34. }