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(),
     });
예제 #2
0
        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);
            }
        }
예제 #3
0
        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));
        }