private void OnGlobalOperationStopped(object sender, GlobalOperationEventArgs e)
                    {
                        Contract.ThrowIfFalse(_globalOperation != null);

                        // events are serialized. no lock is needed
                        _globalOperation.SetResult(null);
                        _globalOperation = null;

                        // set to empty task so that we don't need a lock
                        _globalOperationTask = SpecializedTasks.EmptyTask;
                    }
        protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList<string> operations, bool cancelled)
        {
            var ev = _eventMap.GetEventHandlers<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName);
            if (ev.HasHandlers)
            {
                var args = new GlobalOperationEventArgs(operations, cancelled);

                return _eventQueue.ScheduleTask(() =>
                {
                    ev.RaiseEvent(handler => handler(this, args));
                });
            }

            return SpecializedTasks.EmptyTask;
        }
        private void OnGlobalOperationStopped(object sender, GlobalOperationEventArgs e)
        {
            if (_globalOperation == null)
            {
                // we subscribed to the event while it is already running.
                return;
            }

            // events are serialized. no lock is needed
            _globalOperation.SetResult(null);
            _globalOperation = null;

            // set to empty task so that we don't need a lock
            _globalOperationTask = SpecializedTasks.EmptyTask;
        }
        protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList <string> operations, bool cancelled)
        {
            var ev = _eventMap.GetEventHandlers <EventHandler <GlobalOperationEventArgs> >(GlobalOperationStoppedEventName);

            if (ev.HasHandlers)
            {
                var args = new GlobalOperationEventArgs(operations, cancelled);

                return(_eventQueue.ScheduleTask(() =>
                {
                    ev.RaiseEvent(handler => handler(this, args));
                }));
            }

            return(SpecializedTasks.EmptyTask);
        }
        protected virtual Task RaiseGlobalOperationStoppedAsync(IReadOnlyList <string> operations, bool cancelled)
        {
            var ev = _eventMap.GetEventHandlers <EventHandler <GlobalOperationEventArgs> >(GlobalOperationStoppedEventName);

            if (ev.HasHandlers)
            {
                var asyncToken = _listener.BeginAsyncOperation("GlobalOperationStopped");
                var args       = new GlobalOperationEventArgs(operations, cancelled);

                return(_eventQueue.ScheduleTask(() =>
                {
                    ev.RaiseEvent(handler => handler(this, args));
                }).CompletesAsyncOperation(asyncToken));
            }

            return(Task.CompletedTask);
        }
        protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList<string> operations, bool cancelled)
        {
            var handlers = _eventMap.GetEventHandlers<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName);
            if (handlers.Length > 0)
            {
                var args = new GlobalOperationEventArgs(operations, cancelled);

                return _eventQueue.ScheduleTask(() =>
                {
                    foreach (var handler in handlers)
                    {
                        handler(this, args);
                    }
                });
            }

            return SpecializedTasks.EmptyTask;
        }
        protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList<string> operations, bool cancelled)
        {
            var handlers = this.eventMap.GetEventHandlers<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName);
            if (handlers != null)
            {
                var args = new GlobalOperationEventArgs(operations, cancelled);

                return this.eventQueue.ScheduleTask(() =>
                {
                    foreach (var handler in handlers)
                    {
                        handler(this, args);
                    }
                });
            }

            return SpecializedTasks.EmptyTask;
        }