Unity 框架

UniTask.AsValueTask.cs 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #pragma warning disable 0649
  2. #if UNITASK_NETCORE || UNITY_2022_3_OR_NEWER
  3. #define SUPPORT_VALUETASK
  4. #endif
  5. #if SUPPORT_VALUETASK
  6. using System;
  7. using System.Threading.Tasks;
  8. using System.Threading.Tasks.Sources;
  9. namespace Cysharp.Threading.Tasks
  10. {
  11. public static class UniTaskValueTaskExtensions
  12. {
  13. public static ValueTask AsValueTask(this in UniTask task)
  14. {
  15. #if (UNITASK_NETCORE && NETSTANDARD2_0)
  16. return new ValueTask(new UniTaskValueTaskSource(task), 0);
  17. #else
  18. return task;
  19. #endif
  20. }
  21. public static ValueTask<T> AsValueTask<T>(this in UniTask<T> task)
  22. {
  23. #if (UNITASK_NETCORE && NETSTANDARD2_0)
  24. return new ValueTask<T>(new UniTaskValueTaskSource<T>(task), 0);
  25. #else
  26. return task;
  27. #endif
  28. }
  29. public static async UniTask<T> AsUniTask<T>(this ValueTask<T> task)
  30. {
  31. return await task;
  32. }
  33. public static async UniTask AsUniTask(this ValueTask task)
  34. {
  35. await task;
  36. }
  37. #if (UNITASK_NETCORE && NETSTANDARD2_0)
  38. class UniTaskValueTaskSource : IValueTaskSource
  39. {
  40. readonly UniTask task;
  41. readonly UniTask.Awaiter awaiter;
  42. public UniTaskValueTaskSource(UniTask task)
  43. {
  44. this.task = task;
  45. this.awaiter = task.GetAwaiter();
  46. }
  47. public void GetResult(short token)
  48. {
  49. awaiter.GetResult();
  50. }
  51. public ValueTaskSourceStatus GetStatus(short token)
  52. {
  53. return (ValueTaskSourceStatus)task.Status;
  54. }
  55. public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
  56. {
  57. awaiter.SourceOnCompleted(continuation, state);
  58. }
  59. }
  60. class UniTaskValueTaskSource<T> : IValueTaskSource<T>
  61. {
  62. readonly UniTask<T> task;
  63. readonly UniTask<T>.Awaiter awaiter;
  64. public UniTaskValueTaskSource(UniTask<T> task)
  65. {
  66. this.task = task;
  67. this.awaiter = task.GetAwaiter();
  68. }
  69. public T GetResult(short token)
  70. {
  71. return awaiter.GetResult();
  72. }
  73. public ValueTaskSourceStatus GetStatus(short token)
  74. {
  75. return (ValueTaskSourceStatus)task.Status;
  76. }
  77. public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
  78. {
  79. awaiter.SourceOnCompleted(continuation, state);
  80. }
  81. }
  82. #endif
  83. }
  84. }
  85. #endif