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