/// <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); }
/// <summary> /// Initializes the invoke queue. /// </summary> private void InitializeInvokeQueue() { if (InvokeQueue != null) { InvokeQueue.Dispose(); } InvokeQueue = new BlockingCollection <Action>(new ConcurrentQueue <Action>(), 100); }
/// <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(); }
/// <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."); }
/// <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); }