diff --git a/src/Features/Core/Diagnostics/DiagnosticService.cs b/src/Features/Core/Diagnostics/DiagnosticService.cs index a05dfd4bc2d3ab23b675e09b88d8ecd80d020b12..0600d9bce2517c62eb6fb6a485cbd3f223b729e9 100644 --- a/src/Features/Core/Diagnostics/DiagnosticService.cs +++ b/src/Features/Core/Diagnostics/DiagnosticService.cs @@ -58,13 +58,14 @@ internal class DiagnosticService : IDiagnosticService private void RaiseDiagnosticsUpdated(object sender, DiagnosticsUpdatedArgs args) { - if (_eventMap.HasEventHandlers>(DiagnosticsUpdatedEventName)) + var ev = _eventMap.GetEventHandlers>(DiagnosticsUpdatedEventName); + if (ev.HasHandlers) { var eventToken = _listener.BeginAsyncOperation(DiagnosticsUpdatedEventName); _eventQueue.ScheduleTask(() => { UpdateDataMap(sender, args); - _eventMap.RaiseEvent>(DiagnosticsUpdatedEventName, handler => handler(sender, args)); + ev.RaiseEvent(handler => handler(sender, args)); }).CompletesAsyncOperation(eventToken); } } diff --git a/src/Features/Core/SolutionCrawler/SolutionCrawlerProgressReporter.cs b/src/Features/Core/SolutionCrawler/SolutionCrawlerProgressReporter.cs index 089a907085b6887a8afd8fcb3e779d570552bced..b0a31c39135c75428940d6da1f24feb94841a1dc 100644 --- a/src/Features/Core/SolutionCrawler/SolutionCrawlerProgressReporter.cs +++ b/src/Features/Core/SolutionCrawler/SolutionCrawlerProgressReporter.cs @@ -106,11 +106,12 @@ private Task RaiseStopped() private Task RaiseEvent(string eventName) { // this method name doesnt have Async since it should work as async void. - if (_eventMap.HasEventHandlers(eventName)) + var ev = _eventMap.GetEventHandlers(eventName); + if (ev.HasHandlers) { return _eventQueue.ScheduleTask(() => { - _eventMap.RaiseEvent(eventName, handler => handler(this, EventArgs.Empty)); + ev.RaiseEvent(handler => handler(this, EventArgs.Empty)); }); } diff --git a/src/Workspaces/Core/Portable/Notification/GlobalOperationNotificationService.cs b/src/Workspaces/Core/Portable/Notification/GlobalOperationNotificationService.cs index f270b85484bd92cc1043b6b354ec8c33c270afb2..6e09972b8a18f87ec09b138ed47963b174245c3c 100644 --- a/src/Workspaces/Core/Portable/Notification/GlobalOperationNotificationService.cs +++ b/src/Workspaces/Core/Portable/Notification/GlobalOperationNotificationService.cs @@ -49,11 +49,12 @@ public override GlobalOperationRegistration Start(string operation) protected virtual Task RaiseGlobalOperationStarted() { - if (_eventMap.HasEventHandlers(GlobalOperationStartedEventName)) + var ev = _eventMap.GetEventHandlers(GlobalOperationStartedEventName); + if (ev.HasHandlers) { return _eventQueue.ScheduleTask(() => { - _eventMap.RaiseEvent(GlobalOperationStartedEventName, handler => handler(this, EventArgs.Empty)); + ev.RaiseEvent(handler => handler(this, EventArgs.Empty)); }); } @@ -62,13 +63,14 @@ protected virtual Task RaiseGlobalOperationStarted() protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList operations, bool cancelled) { - if (_eventMap.HasEventHandlers>(GlobalOperationStoppedEventName)) + var ev = _eventMap.GetEventHandlers>(GlobalOperationStoppedEventName); + if (ev.HasHandlers) { var args = new GlobalOperationEventArgs(operations, cancelled); return _eventQueue.ScheduleTask(() => { - _eventMap.RaiseEvent>(GlobalOperationStoppedEventName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); }); } diff --git a/src/Workspaces/Core/Portable/Utilities/EventMap.cs b/src/Workspaces/Core/Portable/Utilities/EventMap.cs index e5f0c1e00d38f0a049a7f5ea3d1ec3971f0ce304..2431aa4c3c8c022cbf8793e054d3a06aaa48ae3a 100644 --- a/src/Workspaces/Core/Portable/Utilities/EventMap.cs +++ b/src/Workspaces/Core/Portable/Utilities/EventMap.cs @@ -53,23 +53,10 @@ public void RemoveEventHandler(string eventName, TEventHandler ev } } - public bool HasEventHandlers(string eventName) + public EventHandlerSet GetEventHandlers(string eventName) where TEventHandler : class { - return this.GetRegistries(eventName).Length > 0; - } - - public void RaiseEvent(string eventName, Action invoker) - where TEventHandler : class - { - var registries = GetRegistries(eventName); - if (registries.Length > 0) - { - foreach (var registry in registries) - { - registry.Invoke(invoker); - } - } + return new EventHandlerSet(this.GetRegistries(eventName)); } private ImmutableArray> GetRegistries(string eventName) @@ -147,5 +134,32 @@ public override int GetHashCode() return this.handler.GetHashCode(); } } + + internal struct EventHandlerSet + where TEventHandler : class + { + private ImmutableArray> registries; + + internal EventHandlerSet(object registries) + { + this.registries = (ImmutableArray>) registries; + } + + public bool HasHandlers + { + get { return this.registries != null && this.registries.Length > 0; } + } + + public void RaiseEvent(Action invoker) + { + if (this.HasHandlers) + { + foreach (var registry in registries) + { + registry.Invoke(invoker); + } + } + } + } } } diff --git a/src/Workspaces/Core/Portable/Workspace/Workspace_Events.cs b/src/Workspaces/Core/Portable/Workspace/Workspace_Events.cs index b71529572c96da3fca372a7e9d24f3b2c0e42a14..ddad8215dc9837468b0331202570920cb22a5594 100644 --- a/src/Workspaces/Core/Portable/Workspace/Workspace_Events.cs +++ b/src/Workspaces/Core/Portable/Workspace/Workspace_Events.cs @@ -48,12 +48,13 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio projectId = documentId.ProjectId; } - if (_eventMap.HasEventHandlers>(WorkspaceChangeEventName)) + var ev = _eventMap.GetEventHandlers>(WorkspaceChangeEventName); + if (ev.HasHandlers) { return this.ScheduleTask(() => { var args = new WorkspaceChangeEventArgs(kind, oldSolution, newSolution, projectId, documentId); - _eventMap.RaiseEvent>(WorkspaceChangeEventName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); }, "Workspace.WorkspaceChanged"); } else @@ -81,10 +82,11 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic) { - if (_eventMap.HasEventHandlers>(WorkspaceFailedEventName)) + var ev = _eventMap.GetEventHandlers>(WorkspaceFailedEventName); + if (ev.HasHandlers) { var args = new WorkspaceDiagnosticEventArgs(diagnostic); - _eventMap.RaiseEvent>(WorkspaceFailedEventName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); } } @@ -106,12 +108,13 @@ protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic protected Task RaiseDocumentOpenedEventAsync(Document document) { - if (_eventMap.HasEventHandlers>(DocumentOpenedEventName)) + var ev = _eventMap.GetEventHandlers>(DocumentOpenedEventName); + if (ev.HasHandlers) { return this.ScheduleTask(() => { var args = new DocumentEventArgs(document); - _eventMap.RaiseEvent>(DocumentOpenedEventName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); }, "Workspace.WorkspaceChanged"); } else @@ -138,12 +141,13 @@ protected Task RaiseDocumentOpenedEventAsync(Document document) protected Task RaiseDocumentClosedEventAsync(Document document) { - if (_eventMap.HasEventHandlers>(DocumentClosedEventName)) + var ev = _eventMap.GetEventHandlers>(DocumentClosedEventName); + if (ev.HasHandlers) { return this.ScheduleTask(() => { var args = new DocumentEventArgs(document); - _eventMap.RaiseEvent>(DocumentClosedEventName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); }, "Workspace.DocumentClosed"); } else @@ -171,12 +175,13 @@ protected Task RaiseDocumentClosedEventAsync(Document document) protected Task RaiseDocumentActiveContextChangedEventAsync(Document document) { - if (_eventMap.HasEventHandlers>(DocumentActiveContextChangedName)) + var ev = _eventMap.GetEventHandlers>(DocumentActiveContextChangedName); + if (ev.HasHandlers) { return this.ScheduleTask(() => { var args = new DocumentEventArgs(document); - _eventMap.RaiseEvent>(DocumentActiveContextChangedName, handler => handler(this, args)); + ev.RaiseEvent(handler => handler(this, args)); }, "Workspace.WorkspaceChanged"); } else