Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
SynchronizationContextAwaitTaskContinuation.cs
Go to the documentation of this file.
3
5
7{
8 private static readonly SendOrPostCallback s_postCallback = delegate(object state)
9 {
10 ((Action)state)();
11 };
12
14
16
17 internal SynchronizationContextAwaitTaskContinuation(SynchronizationContext context, Action action, bool flowExecutionContext)
18 : base(action, flowExecutionContext)
19 {
20 m_syncContext = context;
21 }
22
23 internal sealed override void Run(Task task, bool canInlineContinuationTask)
24 {
25 if (canInlineContinuationTask && m_syncContext == SynchronizationContext.Current)
26 {
28 return;
29 }
31 if (log.IsEnabled())
32 {
34 log.AwaitTaskContinuationScheduled((task.ExecutingTaskScheduler ?? TaskScheduler.Default).Id, task.Id, m_continuationId);
35 }
37 }
38
39 private static void PostAction(object state)
40 {
43 if (log.IsEnabled() && log.TasksSetActivityIds && synchronizationContextAwaitTaskContinuation.m_continuationId != 0)
44 {
45 synchronizationContextAwaitTaskContinuation.m_syncContext.Post(s_postCallback, GetActionLogDelegate(synchronizationContextAwaitTaskContinuation.m_continuationId, synchronizationContextAwaitTaskContinuation.m_action));
46 }
47 else
48 {
49 synchronizationContextAwaitTaskContinuation.m_syncContext.Post(s_postCallback, synchronizationContextAwaitTaskContinuation.m_action);
50 }
51 }
52
53 private static Action GetActionLogDelegate(int continuationId, Action action)
54 {
55 return delegate
56 {
57 Guid activityId = TplEventSource.CreateGuidForTaskID(continuationId);
58 EventSource.SetCurrentThreadActivityId(activityId, out var oldActivityThatWillContinue);
59 try
60 {
61 action();
62 }
63 finally
64 {
65 EventSource.SetCurrentThreadActivityId(oldActivityThatWillContinue);
66 }
67 };
68 }
69
70 [MethodImpl(MethodImplOptions.AggressiveInlining)]
72 {
73 return PostAction;
74 }
75}
static void SetCurrentThreadActivityId(Guid activityId)
virtual void Post(SendOrPostCallback d, object? state)
static ? SynchronizationContext Current
void RunCallback(ContextCallback callback, object state, ref Task currentTask)
SynchronizationContextAwaitTaskContinuation(SynchronizationContext context, Action action, bool flowExecutionContext)
static Task t_currentTask
Definition Task.cs:942
static readonly TplEventSource Log
static Guid CreateGuidForTaskID(int taskID)
unsafe void AwaitTaskContinuationScheduled(int OriginatingTaskSchedulerID, int OriginatingTaskID, int ContinueWithTaskId)
delegate void ContextCallback(object? state)
delegate void Action()