Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

128 Zeilen
4.2 KiB

  1. #pragma warning disable CS1591
  2. #pragma warning disable CS0108
  3. #if (UNITASK_NETCORE && !NETSTANDARD2_0) || UNITY_2022_3_OR_NEWER
  4. #define SUPPORT_VALUETASK
  5. #endif
  6. using System;
  7. using System.Runtime.CompilerServices;
  8. namespace Cysharp.Threading.Tasks
  9. {
  10. public enum UniTaskStatus
  11. {
  12. /// <summary>The operation has not yet completed.</summary>
  13. Pending = 0,
  14. /// <summary>The operation completed successfully.</summary>
  15. Succeeded = 1,
  16. /// <summary>The operation completed with an error.</summary>
  17. Faulted = 2,
  18. /// <summary>The operation completed due to cancellation.</summary>
  19. Canceled = 3
  20. }
  21. // similar as IValueTaskSource
  22. public interface IUniTaskSource
  23. #if SUPPORT_VALUETASK
  24. : System.Threading.Tasks.Sources.IValueTaskSource
  25. #endif
  26. {
  27. UniTaskStatus GetStatus(short token);
  28. void OnCompleted(Action<object> continuation, object state, short token);
  29. void GetResult(short token);
  30. UniTaskStatus UnsafeGetStatus(); // only for debug use.
  31. #if SUPPORT_VALUETASK
  32. System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token)
  33. {
  34. return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token);
  35. }
  36. void System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short token)
  37. {
  38. ((IUniTaskSource)this).GetResult(token);
  39. }
  40. void System.Threading.Tasks.Sources.IValueTaskSource.OnCompleted(Action<object> continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags)
  41. {
  42. // ignore flags, always none.
  43. ((IUniTaskSource)this).OnCompleted(continuation, state, token);
  44. }
  45. #endif
  46. }
  47. public interface IUniTaskSource<out T> : IUniTaskSource
  48. #if SUPPORT_VALUETASK
  49. , System.Threading.Tasks.Sources.IValueTaskSource<T>
  50. #endif
  51. {
  52. new T GetResult(short token);
  53. #if SUPPORT_VALUETASK
  54. new public UniTaskStatus GetStatus(short token)
  55. {
  56. return ((IUniTaskSource)this).GetStatus(token);
  57. }
  58. new public void OnCompleted(Action<object> continuation, object state, short token)
  59. {
  60. ((IUniTaskSource)this).OnCompleted(continuation, state, token);
  61. }
  62. System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource<T>.GetStatus(short token)
  63. {
  64. return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token);
  65. }
  66. T System.Threading.Tasks.Sources.IValueTaskSource<T>.GetResult(short token)
  67. {
  68. return ((IUniTaskSource<T>)this).GetResult(token);
  69. }
  70. void System.Threading.Tasks.Sources.IValueTaskSource<T>.OnCompleted(Action<object> continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags)
  71. {
  72. // ignore flags, always none.
  73. ((IUniTaskSource)this).OnCompleted(continuation, state, token);
  74. }
  75. #endif
  76. }
  77. public static class UniTaskStatusExtensions
  78. {
  79. /// <summary>status != Pending.</summary>
  80. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  81. public static bool IsCompleted(this UniTaskStatus status)
  82. {
  83. return status != UniTaskStatus.Pending;
  84. }
  85. /// <summary>status == Succeeded.</summary>
  86. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  87. public static bool IsCompletedSuccessfully(this UniTaskStatus status)
  88. {
  89. return status == UniTaskStatus.Succeeded;
  90. }
  91. /// <summary>status == Canceled.</summary>
  92. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  93. public static bool IsCanceled(this UniTaskStatus status)
  94. {
  95. return status == UniTaskStatus.Canceled;
  96. }
  97. /// <summary>status == Faulted.</summary>
  98. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  99. public static bool IsFaulted(this UniTaskStatus status)
  100. {
  101. return status == UniTaskStatus.Faulted;
  102. }
  103. }
  104. }