Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ValueTask.cs
Go to the documentation of this file.
8
10
13public readonly struct ValueTask : IEquatable<ValueTask>
14{
15 private sealed class ValueTaskSourceAsTask : Task
16 {
17 private static readonly Action<object> s_completionAction = delegate(object state)
18 {
20 {
22 return;
23 }
24 valueTaskSourceAsTask._source = null;
25 ValueTaskSourceStatus status = source.GetStatus(valueTaskSourceAsTask._token);
26 try
27 {
28 source.GetResult(valueTaskSourceAsTask._token);
29 valueTaskSourceAsTask.TrySetResult();
30 }
31 catch (Exception ex)
32 {
33 if (status == ValueTaskSourceStatus.Canceled)
34 {
36 {
37 valueTaskSourceAsTask.TrySetCanceled(ex2.CancellationToken, ex2);
38 }
39 else
40 {
41 valueTaskSourceAsTask.TrySetCanceled(new CancellationToken(canceled: true));
42 }
43 }
44 else
45 {
46 valueTaskSourceAsTask.TrySetException(ex);
47 }
48 }
49 };
50
52
53 private readonly short _token;
54
61 }
62
63 private static volatile Task s_canceledTask;
64
65 internal readonly object _obj;
66
67 internal readonly short _token;
68
69 internal readonly bool _continueOnCapturedContext;
70
71 public static ValueTask CompletedTask => default(ValueTask);
72
73 public bool IsCompleted
74 {
75 [MethodImpl(MethodImplOptions.AggressiveInlining)]
76 get
77 {
78 object obj = _obj;
79 if (obj == null)
80 {
81 return true;
82 }
83 if (obj is Task task)
84 {
85 return task.IsCompleted;
86 }
87 return Unsafe.As<IValueTaskSource>(obj).GetStatus(_token) != ValueTaskSourceStatus.Pending;
88 }
89 }
90
92 {
93 [MethodImpl(MethodImplOptions.AggressiveInlining)]
94 get
95 {
96 object obj = _obj;
97 if (obj == null)
98 {
99 return true;
100 }
101 if (obj is Task task)
102 {
103 return task.IsCompletedSuccessfully;
104 }
105 return Unsafe.As<IValueTaskSource>(obj).GetStatus(_token) == ValueTaskSourceStatus.Succeeded;
106 }
107 }
108
109 public bool IsFaulted
110 {
111 get
112 {
113 object obj = _obj;
114 if (obj == null)
115 {
116 return false;
117 }
118 if (obj is Task task)
119 {
120 return task.IsFaulted;
121 }
122 return Unsafe.As<IValueTaskSource>(obj).GetStatus(_token) == ValueTaskSourceStatus.Faulted;
123 }
124 }
125
126 public bool IsCanceled
127 {
128 get
129 {
130 object obj = _obj;
131 if (obj == null)
132 {
133 return false;
134 }
135 if (obj is Task task)
136 {
137 return task.IsCanceled;
138 }
139 return Unsafe.As<IValueTaskSource>(obj).GetStatus(_token) == ValueTaskSourceStatus.Canceled;
140 }
141 }
142
143 [MethodImpl(MethodImplOptions.AggressiveInlining)]
145 {
146 if (task == null)
147 {
149 }
150 _obj = task;
152 _token = 0;
153 }
154
155 [MethodImpl(MethodImplOptions.AggressiveInlining)]
156 public ValueTask(IValueTaskSource source, short token)
157 {
158 if (source == null)
159 {
161 }
162 _obj = source;
163 _token = token;
165 }
166
167 [MethodImpl(MethodImplOptions.AggressiveInlining)]
168 private ValueTask(object obj, short token, bool continueOnCapturedContext)
169 {
170 _obj = obj;
171 _token = token;
173 }
174
176 {
177 return new ValueTask<TResult>(result);
178 }
179
184
189
191 {
193 }
194
199
200 public override int GetHashCode()
201 {
202 return _obj?.GetHashCode() ?? 0;
203 }
204
205 public override bool Equals([NotNullWhen(true)] object? obj)
206 {
207 if (obj is ValueTask)
208 {
209 return Equals((ValueTask)obj);
210 }
211 return false;
212 }
213
214 public bool Equals(ValueTask other)
215 {
216 if (_obj == other._obj)
217 {
218 return _token == other._token;
219 }
220 return false;
221 }
222
223 public static bool operator ==(ValueTask left, ValueTask right)
224 {
225 return left.Equals(right);
226 }
227
228 public static bool operator !=(ValueTask left, ValueTask right)
229 {
230 return !left.Equals(right);
231 }
232
233 public Task AsTask()
234 {
235 object obj = _obj;
236 object obj2;
237 if (obj != null)
238 {
239 obj2 = obj as Task;
240 if (obj2 == null)
241 {
243 }
244 }
245 else
246 {
248 }
249 return (Task)obj2;
250 }
251
253 {
254 if (_obj != null)
255 {
256 return new ValueTask(AsTask());
257 }
258 return this;
259 }
260
262 {
264 if (status != 0)
265 {
266 try
267 {
268 t.GetResult(_token);
269 return Task.CompletedTask;
270 }
271 catch (Exception ex)
272 {
273 if (status == ValueTaskSourceStatus.Canceled)
274 {
276 {
277 Task task = new Task();
278 task.TrySetCanceled(ex2.CancellationToken, ex2);
279 return task;
280 }
282 }
283 return Task.FromException(ex);
284 }
285 }
286 return new ValueTaskSourceAsTask(t, _token);
287 }
288
289 [MethodImpl(MethodImplOptions.AggressiveInlining)]
291 {
292 object obj = _obj;
293 if (obj != null)
294 {
295 if (obj is Task task)
296 {
298 }
299 else
300 {
301 Unsafe.As<IValueTaskSource>(obj).GetResult(_token);
302 }
303 }
304 }
305
307 {
308 return new ValueTaskAwaiter(in this);
309 }
310
311 [MethodImpl(MethodImplOptions.AggressiveInlining)]
317}
320public readonly struct ValueTask<TResult> : IEquatable<ValueTask<TResult>>
321{
322 private sealed class ValueTaskSourceAsTask : Task<TResult>
323 {
324 private static readonly Action<object> s_completionAction = delegate(object state)
325 {
327 {
329 return;
330 }
331 valueTaskSourceAsTask._source = null;
332 ValueTaskSourceStatus status = source.GetStatus(valueTaskSourceAsTask._token);
333 try
334 {
335 valueTaskSourceAsTask.TrySetResult(source.GetResult(valueTaskSourceAsTask._token));
336 }
337 catch (Exception ex)
338 {
339 if (status == ValueTaskSourceStatus.Canceled)
340 {
342 {
343 valueTaskSourceAsTask.TrySetCanceled(ex2.CancellationToken, ex2);
344 }
345 else
346 {
347 valueTaskSourceAsTask.TrySetCanceled(new CancellationToken(canceled: true));
348 }
349 }
350 else
351 {
352 valueTaskSourceAsTask.TrySetException(ex);
353 }
354 }
355 };
356
358
359 private readonly short _token;
360
362 {
363 _source = source;
364 _token = token;
365 source.OnCompleted(s_completionAction, this, token, ValueTaskSourceOnCompletedFlags.None);
366 }
367 }
368
369 private static volatile Task<TResult> s_canceledTask;
370
371 internal readonly object _obj;
372
373 internal readonly TResult _result;
374
375 internal readonly short _token;
376
377 internal readonly bool _continueOnCapturedContext;
378
379 public bool IsCompleted
380 {
381 [MethodImpl(MethodImplOptions.AggressiveInlining)]
382 get
383 {
384 object obj = _obj;
385 if (obj == null)
386 {
387 return true;
388 }
390 {
391 return task.IsCompleted;
392 }
393 return Unsafe.As<IValueTaskSource<TResult>>(obj).GetStatus(_token) != ValueTaskSourceStatus.Pending;
394 }
395 }
396
397 public bool IsCompletedSuccessfully
398 {
399 [MethodImpl(MethodImplOptions.AggressiveInlining)]
400 get
401 {
402 object obj = _obj;
403 if (obj == null)
404 {
405 return true;
406 }
408 {
409 return task.IsCompletedSuccessfully;
410 }
411 return Unsafe.As<IValueTaskSource<TResult>>(obj).GetStatus(_token) == ValueTaskSourceStatus.Succeeded;
412 }
413 }
414
415 public bool IsFaulted
416 {
417 get
418 {
419 object obj = _obj;
420 if (obj == null)
421 {
422 return false;
423 }
425 {
426 return task.IsFaulted;
427 }
428 return Unsafe.As<IValueTaskSource<TResult>>(obj).GetStatus(_token) == ValueTaskSourceStatus.Faulted;
429 }
430 }
431
432 public bool IsCanceled
433 {
434 get
435 {
436 object obj = _obj;
437 if (obj == null)
438 {
439 return false;
440 }
442 {
443 return task.IsCanceled;
444 }
445 return Unsafe.As<IValueTaskSource<TResult>>(obj).GetStatus(_token) == ValueTaskSourceStatus.Canceled;
446 }
447 }
448
451 {
452 [MethodImpl(MethodImplOptions.AggressiveInlining)]
453 get
454 {
455 object obj = _obj;
456 if (obj == null)
457 {
458 return _result;
459 }
461 {
463 return task.ResultOnSuccess;
464 }
465 return Unsafe.As<IValueTaskSource<TResult>>(obj).GetResult(_token);
466 }
467 }
468
469 [MethodImpl(MethodImplOptions.AggressiveInlining)]
470 public ValueTask(TResult result)
471 {
472 _result = result;
473 _obj = null;
475 _token = 0;
476 }
477
478 [MethodImpl(MethodImplOptions.AggressiveInlining)]
480 {
481 if (task == null)
482 {
484 }
485 _obj = task;
486 _result = default(TResult);
488 _token = 0;
489 }
490
491 [MethodImpl(MethodImplOptions.AggressiveInlining)]
493 {
494 if (source == null)
495 {
497 }
498 _obj = source;
499 _token = token;
500 _result = default(TResult);
502 }
503
504 [MethodImpl(MethodImplOptions.AggressiveInlining)]
505 private ValueTask(object obj, TResult result, short token, bool continueOnCapturedContext)
506 {
507 _obj = obj;
508 _result = result;
509 _token = token;
511 }
512
513 public override int GetHashCode()
514 {
515 if (_obj == null)
516 {
517 if (_result == null)
518 {
519 return 0;
520 }
521 return _result.GetHashCode();
522 }
523 return _obj.GetHashCode();
524 }
525
526 public override bool Equals([NotNullWhen(true)] object? obj)
527 {
529 {
531 }
532 return false;
533 }
534
536 {
537 if (_obj == null && other._obj == null)
538 {
539 return EqualityComparer<TResult>.Default.Equals(_result, other._result);
540 }
541 if (_obj == other._obj)
542 {
543 return _token == other._token;
544 }
545 return false;
546 }
547
548 public static bool operator ==(ValueTask<TResult> left, ValueTask<TResult> right)
549 {
550 return left.Equals(right);
551 }
552
553 public static bool operator !=(ValueTask<TResult> left, ValueTask<TResult> right)
554 {
555 return !left.Equals(right);
556 }
557
559 {
560 object obj = _obj;
561 if (obj == null)
562 {
563 return Task.FromResult(_result);
564 }
565 if (obj is Task<TResult> result)
566 {
567 return result;
568 }
570 }
571
573 {
574 if (_obj != null)
575 {
576 return new ValueTask<TResult>(AsTask());
577 }
578 return this;
579 }
580
582 {
583 ValueTaskSourceStatus status = t.GetStatus(_token);
584 if (status != 0)
585 {
586 try
587 {
588 return Task.FromResult(t.GetResult(_token));
589 }
590 catch (Exception ex)
591 {
592 if (status == ValueTaskSourceStatus.Canceled)
593 {
595 {
597 task.TrySetCanceled(ex2.CancellationToken, ex2);
598 return task;
599 }
601 }
602 return Task.FromException<TResult>(ex);
603 }
604 }
605 return new ValueTaskSourceAsTask(t, _token);
606 }
607
608 [MethodImpl(MethodImplOptions.AggressiveInlining)]
610 {
611 return new ValueTaskAwaiter<TResult>(in this);
612 }
613
614 [MethodImpl(MethodImplOptions.AggressiveInlining)]
620
621 public override string? ToString()
622 {
624 {
626 TResult result = Result;
627 if (result != null)
628 {
629 return result.ToString();
630 }
631 }
632 return string.Empty;
633 }
634}
static void NotifyOfCrossThreadDependency()
Definition Debugger.cs:44
static Task FromException(Exception exception)
Definition Task.cs:3341
static Task FromCanceled(CancellationToken cancellationToken)
Definition Task.cs:3363
static Task CompletedTask
Definition Task.cs:1120
CancellationToken CancellationToken
Definition Task.cs:1082
static readonly Action< object > s_completionAction
Definition ValueTask.cs:17
ValueTaskSourceAsTask(IValueTaskSource source, short token)
Definition ValueTask.cs:55
ValueTaskSourceAsTask(IValueTaskSource< TResult > source, short token)
Definition ValueTask.cs:361
static void ThrowArgumentOutOfRangeException(System.ExceptionArgument argument)
static void ThrowArgumentNullException(string name)
void OnCompleted(Action< object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags)
ValueTaskSourceStatus GetStatus(short token)
static ValueTask CompletedTask
Definition ValueTask.cs:71
ValueTask(IValueTaskSource source, short token)
Definition ValueTask.cs:156
ValueTask(IValueTaskSource< TResult > source, short token)
Definition ValueTask.cs:492
readonly bool _continueOnCapturedContext
Definition ValueTask.cs:69
static ValueTask FromCanceled(CancellationToken cancellationToken)
Definition ValueTask.cs:180
ConfiguredValueTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition ValueTask.cs:615
static bool operator==(ValueTask left, ValueTask right)
Definition ValueTask.cs:223
static ValueTask< TResult > FromResult< TResult >(TResult result)
Definition ValueTask.cs:175
Task GetTaskForValueTaskSource(IValueTaskSource t)
Definition ValueTask.cs:261
ValueTask(object obj, TResult result, short token, bool continueOnCapturedContext)
Definition ValueTask.cs:505
static ValueTask< TResult > FromException< TResult >(Exception exception)
Definition ValueTask.cs:195
override? string ToString()
Definition ValueTask.cs:621
static volatile Task s_canceledTask
Definition ValueTask.cs:63
ValueTask(Task< TResult > task)
Definition ValueTask.cs:479
static bool operator!=(ValueTask left, ValueTask right)
Definition ValueTask.cs:228
static ValueTask< TResult > FromCanceled< TResult >(CancellationToken cancellationToken)
Definition ValueTask.cs:185
ValueTaskAwaiter< TResult > GetAwaiter()
Definition ValueTask.cs:609
override bool Equals([NotNullWhen(true)] object? obj)
Definition ValueTask.cs:205
Task< TResult > GetTaskForValueTaskSource(IValueTaskSource< TResult > t)
Definition ValueTask.cs:581
static volatile Task< TResult > s_canceledTask
Definition ValueTask.cs:369
ValueTask(object obj, short token, bool continueOnCapturedContext)
Definition ValueTask.cs:168
ValueTask< TResult > Preserve()
Definition ValueTask.cs:572
ConfiguredValueTaskAwaitable ConfigureAwait(bool continueOnCapturedContext)
Definition ValueTask.cs:312
bool Equals(ValueTask other)
Definition ValueTask.cs:214
static ValueTask FromException(Exception exception)
Definition ValueTask.cs:190
bool Equals(ValueTask< TResult > other)
Definition ValueTask.cs:535
ValueTaskAwaiter GetAwaiter()
Definition ValueTask.cs:306