Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
UnwrapPromise.cs
Go to the documentation of this file.
4
6
7internal sealed class UnwrapPromise<TResult> : Task<TResult>, ITaskCompletionAction
8{
9 private byte _state;
10
11 private readonly bool _lookForOce;
12
13 public bool InvokeMayRunArbitraryCode => true;
14
17 {
19 if (TplEventSource.Log.IsEnabled())
20 {
21 TplEventSource.Log.TraceOperationBegin(base.Id, "Task.Unwrap", 0L);
22 }
24 {
26 }
27 if (outerTask.IsCompleted)
28 {
30 }
31 else
32 {
33 outerTask.AddCompletionAction(this);
34 }
35 }
36
48
50 {
51 switch (_state)
52 {
53 case 0:
55 break;
56 case 1:
57 {
58 bool flag = TrySetFromTask(completingTask, lookForOce: false);
59 _state = 2;
60 break;
61 }
62 }
63 }
64
73
75 {
76 _state = 1;
77 switch (task.Status)
78 {
79 case TaskStatus.Canceled:
80 case TaskStatus.Faulted:
81 {
82 bool flag = TrySetFromTask(task, _lookForOce);
83 break;
84 }
85 case TaskStatus.RanToCompletion:
87 break;
88 }
89 }
90
91 private bool TrySetFromTask(Task task, bool lookForOce)
92 {
93 if (TplEventSource.Log.IsEnabled())
94 {
95 TplEventSource.Log.TraceOperationRelation(base.Id, CausalityRelation.Join);
96 }
97 bool result = false;
98 switch (task.Status)
99 {
100 case TaskStatus.Canceled:
101 result = TrySetCanceled(task.CancellationToken, task.GetCancellationExceptionDispatchInfo());
102 break;
103 case TaskStatus.Faulted:
104 {
105 List<ExceptionDispatchInfo> exceptionDispatchInfos = task.GetExceptionDispatchInfos();
107 result = ((!lookForOce || exceptionDispatchInfos.Count <= 0 || (exceptionDispatchInfo = exceptionDispatchInfos[0]) == null || !(exceptionDispatchInfo.SourceException is OperationCanceledException ex)) ? TrySetException(exceptionDispatchInfos) : TrySetCanceled(ex.CancellationToken, exceptionDispatchInfo));
108 break;
109 }
110 case TaskStatus.RanToCompletion:
111 if (TplEventSource.Log.IsEnabled())
112 {
113 TplEventSource.Log.TraceOperationEnd(base.Id, AsyncCausalityStatus.Completed);
114 }
116 {
118 }
119 result = TrySetResult((task is Task<TResult> task2) ? task2.Result : default(TResult));
120 break;
121 }
122 return result;
123 }
124
126 {
127 if (task == null)
128 {
130 _state = 2;
131 }
132 else if (task.IsCompleted)
133 {
135 _state = 2;
136 }
137 else
138 {
139 task.AddCompletionAction(this);
140 }
141 }
142}
static bool s_asyncDebuggingEnabled
Definition Task.cs:960
bool TrySetCanceled(CancellationToken tokenToRecord)
Definition Task.cs:2555
bool TrySetException(object exceptionObject)
Definition Task.cs:2542
TaskCreationOptions CreationOptions
Definition Task.cs:1097
static bool AddToActiveTasks(Task task)
Definition Task.cs:1186
static void RemoveFromActiveTasks(Task task)
Definition Task.cs:1197
static readonly TplEventSource Log
void InvokeCore(Task completingTask)
UnwrapPromise(Task outerTask, bool lookForOce)
bool TrySetFromTask(Task task, bool lookForOce)
void InvokeCoreAsync(Task completingTask)
void Invoke(Task completingTask)
static bool UnsafeQueueUserWorkItem(WaitCallback callBack, object? state)