// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Xunit; namespace Microsoft.CodeAnalysis.Razor { internal class SingleThreadedForegroundDispatcher : ForegroundDispatcher { public SingleThreadedForegroundDispatcher() { ForegroundScheduler = SynchronizationContext.Current == null ? new ThrowingTaskScheduler() : TaskScheduler.FromCurrentSynchronizationContext(); BackgroundScheduler = TaskScheduler.Default; } public override TaskScheduler ForegroundScheduler { get; } public override TaskScheduler BackgroundScheduler { get; } private Thread Thread { get; } = Thread.CurrentThread; public override bool IsForegroundThread => Thread.CurrentThread == Thread; private class ThrowingTaskScheduler : TaskScheduler { protected override IEnumerable GetScheduledTasks() { return Enumerable.Empty(); } protected override void QueueTask(Task task) { throw new InvalidOperationException($"Use [{nameof(ForegroundFactAttribute)}]"); } protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { throw new InvalidOperationException($"Use [{nameof(ForegroundFactAttribute)}]"); } } } }