// Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Perspex.Threading { /// /// SynchronizationContext to be used on main thread /// public class PerspexSynchronizationContext : SynchronizationContext { /// /// Controls if SynchronizationContext should be installed in InstallIfNeeded. Used by Designer. /// public static bool AutoInstall { get; set; } = true; /// /// Installs synchronization context in current thread /// public static void InstallIfNeeded() { if (!AutoInstall || Current is PerspexSynchronizationContext) { return; } SetSynchronizationContext(new PerspexSynchronizationContext()); } /// public override void Post(SendOrPostCallback d, object state) { Dispatcher.UIThread.Post(() => d(state)); } /// public override void Send(SendOrPostCallback d, object state) { // TODO: Add check for being on the main thread, we should invoke the method immediately in this case Dispatcher.UIThread.InvokeAsync(() => d(state)).Wait(); } } }