/// <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); } }
/// <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; } }