• SmartDispatcher 类


    UI线程中使用

    public class SmartDispatcher
    {
        public static void BeginInvoke(Action action)
        {
            if (Deployment.Current.Dispatcher.CheckAccess() 
                || DesignerProperties.IsInDesignTool)
            {
                action();
            }
            else
            {
                Deployment.Current.Dispatcher.BeginInvoke(action);
            }
        }
    }
     
     
    using System.ComponentModel;
     
    namespace System.Windows.Threading
    {
        /// <summary>
        /// A smart dispatcher system for routing actions to the user interface
        /// thread.
        /// </summary>
        public static class SmartDispatcher
        {
            /// <summary>
            /// A single Dispatcher instance to marshall actions to the user
            /// interface thread.
            /// </summary>
            private static Dispatcher _instance;
     
            /// <summary>
            /// Backing field for a value indicating whether this is a design-time
            /// environment.
            /// </summary>
            private static bool? _designer;
             
            /// <summary>
            /// Requires an instance and attempts to find a Dispatcher if one has
            /// not yet been set.
            /// </summary>
            private static void RequireInstance()
            {
                if (_designer == null)
                {
                    _designer = DesignerProperties.IsInDesignTool;
                }
     
                // Design-time is more of a no-op, won't be able to resolve the
                // dispatcher if it isn't already set in these situations.
                if (_designer == true)
                {
                    return;
                }
     
                // Attempt to use the RootVisual of the plugin to retrieve a
                // dispatcher instance. This call will only succeed if the current
                // thread is the UI thread.
                try
                {
                    _instance = Application.Current.RootVisual.Dispatcher;
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException("The first time SmartDispatcher is used must be from a user interface thread. Consider having the application call Initialize, with or without an instance.", e);
                }
     
                if (_instance == null)
                {
                    throw new InvalidOperationException("Unable to find a suitable Dispatcher instance.");
                }
            }
     
            /// <summary>
            /// Initializes the SmartDispatcher system, attempting to use the
            /// RootVisual of the plugin to retrieve a Dispatcher instance.
            /// </summary>
            public static void Initialize()
            {
                if (_instance == null)
                {
                    RequireInstance();
                }
            }
     
            /// <summary>
            /// Initializes the SmartDispatcher system with the dispatcher
            /// instance.
            /// </summary>
            /// <param name="dispatcher">The dispatcher instance.</param>
            public static void Initialize(Dispatcher dispatcher)
            {
                if (dispatcher == null)
                {
                    throw new ArgumentNullException("dispatcher");
                }
     
                _instance = dispatcher;
     
                if (_designer == null)
                {
                    _designer = DesignerProperties.IsInDesignTool;
                }
            }
     
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public static bool CheckAccess()
            {
                if (_instance == null)
                {
                    RequireInstance();
                }
     
                return _instance.CheckAccess();
            }
     
            /// <summary>
            /// Executes the specified delegate asynchronously on the user interface
            /// thread. If the current thread is the user interface thread, the
            /// dispatcher if not used and the operation happens immediately.
            /// </summary>
            /// <param name="a">A delegate to a method that takes no arguments and 
            /// does not return a value, which is either pushed onto the Dispatcher 
            /// event queue or immediately run, depending on the current thread.</param>
            public static void BeginInvoke(Action a)
            {
                if (_instance == null)
                {
                    RequireInstance();
                }
     
                // If the current thread is the user interface thread, skip the
                // dispatcher and directly invoke the Action.
                if (_instance.CheckAccess() || _designer == true)
                {
                    a();
                }
                else
                {
                    _instance.BeginInvoke(a);
                }
            }
        }
    }
  • 相关阅读:
    centos7安装rabbitmq 总结
    python第六十三天-- 第十一周作业
    python第六十一天,第六十二天 redis
    python第六十天-----RabbitMQ
    python第五十四天--第十周作业
    python第五十三天--进程,协程.select.异步I/O...
    python第五十二天---第九周作业 类 Fabric 主机管理程序
    python第五十一天----线程,Event,队列
    Python基础之-面向对象编程(引言)
    Python中的模块
  • 原文地址:https://www.cnblogs.com/shiyix/p/3459066.html
Copyright © 2020-2023  润新知