コード例 #1
0
        /// <summary>
        /// Invokes the specified action on the main thread asynchronous.
        /// </summary>
        /// <param name="action">The action.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">action</exception>
        /// <exception cref="System.InvalidOperationException">Application is shutting down.</exception>
        public Task InvokeOnMainAsync(Action action)
        {
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }

            if (InvokeQueue.IsAddingCompleted)
            {
                throw new InvalidOperationException("Application is shutting down.");
            }

            GeneralLog.Debug("Invoke on main called.");

            var taskCompletionSource = new TaskCompletionSource <object>();

            InvokeQueue.Add(() =>
            {
                try
                {
                    action();
                    Window.SyncControllerChangesToClient();

                    taskCompletionSource.SetResult(null);
                }
                catch (Exception e)
                {
                    taskCompletionSource.SetException(e);
                }
            });

            return(taskCompletionSource.Task);
        }
コード例 #2
0
        /// <summary>
        /// Initializes the invoke queue.
        /// </summary>
        private void InitializeInvokeQueue()
        {
            if (InvokeQueue != null)
            {
                InvokeQueue.Dispose();
            }

            InvokeQueue = new BlockingCollection <Action>(new ConcurrentQueue <Action>(), 100);
        }
コード例 #3
0
        /// <summary>
        /// Runs the message loop.
        /// </summary>
        private void RunMessageLoop()
        {
            GeneralLog.Info("Message loop started.");

            foreach (var action in InvokeQueue.GetConsumingEnumerable())
            {
                action();
            }

            GeneralLog.Info("Message loop stoped.");

            InvokeQueue.Dispose();
            OnShutdown();
        }
コード例 #4
0
        /// <summary>
        /// Shutdowns this instance.
        /// </summary>
        /// <exception cref="System.InvalidOperationException">Application is not running.</exception>
        internal void Shutdown()
        {
            EnsureMainThread();

            if (!IsRunning)
            {
                throw new InvalidOperationException("Application is not running.");
            }

            Window.Dispose();
            InvokeQueue.CompleteAdding();

            GeneralLog.Info("Shutdown.");
        }
コード例 #5
0
        /// <summary>
        /// Releases unmanaged and - optionally - managed resources.
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        protected override void Dispose(bool disposing)
        {
            EnsureMainThread();

            if (!_disposed)
            {
                if (disposing)
                {
                    if (InvokeQueue != null)
                    {
                        InvokeQueue.Dispose();
                    }
                }

                _disposed = true;
            }

            base.Dispose(disposing);
        }