// Copyright (c) The Avalonia 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 Avalonia.Threading { /// /// SynchronizationContext to be used on main thread /// public class AvaloniaSynchronizationContext : 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 AvaloniaSynchronizationContext) { return; } SetSynchronizationContext(new AvaloniaSynchronizationContext()); } /// public override void Post(SendOrPostCallback d, object state) { Dispatcher.UIThread.InvokeAsync(() => d(state), DispatcherPriority.Send); } /// public override void Send(SendOrPostCallback d, object state) { if (Dispatcher.UIThread.CheckAccess()) d(state); else Dispatcher.UIThread.InvokeTaskAsync(() => d(state), DispatcherPriority.Send).Wait(); } } }