private static string Convert(__VSTASKRUNCONTEXT value) { return(value switch { __VSTASKRUNCONTEXT.VSTC_UITHREAD_SEND => "UI Thread - RPC", __VSTASKRUNCONTEXT.VSTC_BACKGROUNDTHREAD => "Background Thread", __VSTASKRUNCONTEXT.VSTC_UITHREAD_BACKGROUND_PRIORITY => "UI Thread - Background", __VSTASKRUNCONTEXT.VSTC_UITHREAD_IDLE_PRIORITY => "UI Thread - Idle", __VSTASKRUNCONTEXT.VSTC_UITHREAD_NORMAL_PRIORITY => "UI Thread - Normal", __VSTASKRUNCONTEXT.VSTC_BACKGROUNDTHREAD_LOW_IO_PRIORITY => "Background, low I/O", _ => value.ToString(), });
public static TaskScheduler GetSchedulerFromContext(__VSTASKRUNCONTEXT context) { switch (context) { case __VSTASKRUNCONTEXT.VSTC_BACKGROUNDTHREAD: case __VSTASKRUNCONTEXT.VSTC_BACKGROUNDTHREAD_LOW_IO_PRIORITY: return(TaskScheduler.Default); case __VSTASKRUNCONTEXT.VSTC_UITHREAD_BACKGROUND_PRIORITY: case __VSTASKRUNCONTEXT.VSTC_UITHREAD_IDLE_PRIORITY: case __VSTASKRUNCONTEXT.VSTC_UITHREAD_NORMAL_PRIORITY: case __VSTASKRUNCONTEXT.VSTC_UITHREAD_SEND: case __VSTASKRUNCONTEXT.VSTC_CURRENTCONTEXT: return(AssemblyInitialize.ApplicationTaskScheduler); default: return(TaskScheduler.Current); } }
private FakeIVsTask( FakeIVsTask parent, __VSTASKRUNCONTEXT context, __VSTASKCONTINUATIONOPTIONS options, IVsTaskBody body, object asyncState) { TaskScheduler scheduler = GetSchedulerFromContext(context); TaskContinuationOptions continuationOptions = GetTaskContinuationOptions(options); _t = parent._t.ContinueWith( (task, state) => { body.DoWork(this, 1, new IVsTask[] { parent }, out object result); return(result); }, asyncState, default(CancellationToken), continuationOptions, scheduler); parent.OnMarkedAsBlocking?.Invoke(parent, new BlockingTaskEventArgs(parent, this)); }