Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

105 linhas
2.7 KiB

  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