/// <summary> /// Creates the default ForegroundThreadData assuming that the current thread is the UI thread. /// </summary> /// <param name="defaultKind">The ForegroundThreadDataKind to fall back to if a UI thread cannot be found</param> /// <returns>default ForegroundThreadData values</returns> internal static ForegroundThreadData CreateDefault(ForegroundThreadDataKind defaultKind) { var kind = ForegroundThreadDataInfo.CreateDefault(defaultKind); // None of the work posted to the foregroundTaskScheduler should block pending keyboard/mouse input from the user. // So instead of using the default priority which is above user input, we use Background priority which is 1 level // below user input. var taskScheduler = new SynchronizationContextTaskScheduler(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher, DispatcherPriority.Background)); return(new ForegroundThreadData(Thread.CurrentThread, taskScheduler, kind)); }
internal static ForegroundThreadData CreateDefault() { ForegroundThreadDataKind kind = SynchronizationContext.Current?.GetType().FullName == "System.Windows.Threading.DispatcherSynchronizationContext" ? ForegroundThreadDataKind.Wpf : ForegroundThreadDataKind.Unknown; // None of the work posted to the foregroundTaskScheduler should block pending keyboard/mouse input from the user. // So instead of using the default priority which is above user input, we use Background priority which is 1 level // below user input. var taskScheduler = new SynchronizationContextTaskScheduler(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher, DispatcherPriority.Background)); return(new ForegroundThreadData(Thread.CurrentThread, taskScheduler, kind)); }