csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.6 KiB
102 lines
2.6 KiB
// -----------------------------------------------------------------------
|
|
// <copyright file="Dispatcher.cs" company="Steven Kirk">
|
|
// Copyright 2013 MIT Licence. See licence.md for more information.
|
|
// </copyright>
|
|
// -----------------------------------------------------------------------
|
|
|
|
namespace Perspex.Threading
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Security;
|
|
using System.Threading;
|
|
using Perspex.Platform;
|
|
using Splat;
|
|
|
|
public enum DispatcherPriority
|
|
{
|
|
Invalid = -1,
|
|
Inactive = 0,
|
|
SystemIdle = 1,
|
|
ApplicationIdle = 2,
|
|
ContextIdle = 3,
|
|
Background = 4,
|
|
Input = 5,
|
|
Loaded = 6,
|
|
Render = 7,
|
|
DataBind = 8,
|
|
Normal = 9,
|
|
Send = 10,
|
|
}
|
|
|
|
[Flags]
|
|
internal enum Flags
|
|
{
|
|
ShutdownStarted = 1,
|
|
Shutdown = 2,
|
|
Disabled = 4
|
|
}
|
|
|
|
public abstract class Dispatcher
|
|
{
|
|
private static DispatcherFrame mainExecutionFrame = new DispatcherFrame();
|
|
|
|
public static Dispatcher CurrentDispatcher
|
|
{
|
|
get { return Locator.Current.GetService<IPlatformThreadingInterface>().GetThreadDispatcher(); }
|
|
}
|
|
|
|
public abstract bool HasShutdownFinished
|
|
{
|
|
get;
|
|
}
|
|
|
|
public abstract DispatcherFrame CurrentFrame
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public static void PushFrame(DispatcherFrame frame)
|
|
{
|
|
if (frame == null)
|
|
{
|
|
throw new ArgumentNullException("frame");
|
|
}
|
|
|
|
Dispatcher dis = CurrentDispatcher;
|
|
|
|
if (dis.HasShutdownFinished)
|
|
{
|
|
throw new InvalidOperationException("The Dispatcher has shut down");
|
|
}
|
|
|
|
if (frame.Running != null)
|
|
{
|
|
throw new InvalidOperationException("Frame is already running on a different dispatcher");
|
|
}
|
|
|
|
frame.ParentFrame = dis.CurrentFrame;
|
|
dis.CurrentFrame = frame;
|
|
|
|
frame.Running = dis;
|
|
|
|
dis.RunFrame(frame);
|
|
}
|
|
|
|
|
|
public static void Run()
|
|
{
|
|
PushFrame(mainExecutionFrame);
|
|
}
|
|
|
|
public abstract DispatcherOperation BeginInvoke(Action method);
|
|
|
|
public abstract DispatcherOperation BeginInvoke(DispatcherPriority priority, Action method);
|
|
|
|
protected internal abstract void Reprioritize(DispatcherOperation op, DispatcherPriority oldpriority);
|
|
|
|
protected abstract void RunFrame(DispatcherFrame frame);
|
|
}
|
|
}
|