IEnumeratorAwaiter.cs 901 B

12345678910111213141516171819202122232425262728293031323334353637
  1. using System;
  2. using System.Collections;
  3. using System.Runtime.CompilerServices;
  4. using System.Threading;
  5. namespace UnityAsync.Awaiters
  6. {
  7. public struct IEnumeratorAwaiter : INotifyCompletion
  8. {
  9. static readonly SendOrPostCallback postCallback = state => ((Action)state)();
  10. readonly IEnumerator coroutine;
  11. public IEnumeratorAwaiter(IEnumerator coroutine)
  12. {
  13. this.coroutine = coroutine;
  14. }
  15. public void OnCompleted(Action continuation)
  16. {
  17. if(AsyncManager.InUnityContext)
  18. AsyncManager.StartCoroutine(ContinuationCoroutine(continuation));
  19. else
  20. AsyncManager.UnitySyncContext.Post(postCallback, AsyncManager.StartCoroutine(ContinuationCoroutine(continuation)));
  21. }
  22. IEnumerator ContinuationCoroutine(Action continuation)
  23. {
  24. yield return AsyncManager.StartCoroutine(coroutine);
  25. continuation();
  26. }
  27. public bool IsCompleted => false;
  28. public void GetResult() { }
  29. }
  30. }