예제 #1
0
        /// <summary>
        /// Attempts Registers a callback that will be called
        /// when the application is shutdown.
        /// </summary>
        /// <param name="callback">the callback when the shutdown occurs</param>
        /// <param name="shutdownOrder">the order that the callback will occur.</param>
        /// <returns></returns>
        public static bool TryRegisterCallback(Action callback, ShutdownHandlerOrder shutdownOrder = ShutdownHandlerOrder.Default)
        {
            List <WeakAction> list;

            switch (shutdownOrder)
            {
            case ShutdownHandlerOrder.First:
                list = s_onShutdownCallbackFirst;
                break;

            case ShutdownHandlerOrder.Default:
                list = s_onShutdownCallbackDefault;
                break;

            case ShutdownHandlerOrder.Last:
                list = s_onShutdownCallbackLast;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(shutdownOrder), shutdownOrder, null);
            }

            if (IsShuttingDown)
            {
                return(false);
            }

            lock (s_syncRoot)
            {
                if (IsShuttingDown)
                {
                    return(false);
                }

                list.RemoveWhere(x => !x.IsAlive);
                list.Add(new WeakAction(callback));

                return(true);
            }
        }
예제 #2
0
        /// <summary>
        /// Attempts Registers a callback that will be called
        /// when the application is shutdown.
        /// </summary>
        /// <param name="callback">the callback when the shutdown occurs</param>
        /// <param name="shutdownOrder">the order that the callback will occur.</param>
        /// <returns></returns>
        public static bool TryRegisterCallback(Action callback, ShutdownHandlerOrder shutdownOrder = ShutdownHandlerOrder.Default)
        {
            List<WeakAction> list;
            switch (shutdownOrder)
            {
                case ShutdownHandlerOrder.First:
                    list = s_onShutdownCallbackFirst;
                    break;
                case ShutdownHandlerOrder.Default:
                    list = s_onShutdownCallbackDefault;
                    break;
                case ShutdownHandlerOrder.Last:
                    list = s_onShutdownCallbackLast;
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(shutdownOrder), shutdownOrder, null);
            }

            if (IsShuttingDown)
                return false;

            lock (s_syncRoot)
            {
                if (IsShuttingDown)
                    return false;

                list.RemoveWhere(x => !x.IsAlive);
                list.Add(new WeakAction(callback));

                return true;
            }
        }