提交 4cc91e88 编写于 作者: M Matt Warren

Capture handlers on initial raise

上级 2107c77e
...@@ -58,13 +58,14 @@ internal class DiagnosticService : IDiagnosticService ...@@ -58,13 +58,14 @@ internal class DiagnosticService : IDiagnosticService
private void RaiseDiagnosticsUpdated(object sender, DiagnosticsUpdatedArgs args) private void RaiseDiagnosticsUpdated(object sender, DiagnosticsUpdatedArgs args)
{ {
if (_eventMap.HasEventHandlers<EventHandler<DiagnosticsUpdatedArgs>>(DiagnosticsUpdatedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<DiagnosticsUpdatedArgs>>(DiagnosticsUpdatedEventName);
if (ev.HasHandlers)
{ {
var eventToken = _listener.BeginAsyncOperation(DiagnosticsUpdatedEventName); var eventToken = _listener.BeginAsyncOperation(DiagnosticsUpdatedEventName);
_eventQueue.ScheduleTask(() => _eventQueue.ScheduleTask(() =>
{ {
UpdateDataMap(sender, args); UpdateDataMap(sender, args);
_eventMap.RaiseEvent<EventHandler<DiagnosticsUpdatedArgs>>(DiagnosticsUpdatedEventName, handler => handler(sender, args)); ev.RaiseEvent(handler => handler(sender, args));
}).CompletesAsyncOperation(eventToken); }).CompletesAsyncOperation(eventToken);
} }
} }
......
...@@ -106,11 +106,12 @@ private Task RaiseStopped() ...@@ -106,11 +106,12 @@ private Task RaiseStopped()
private Task RaiseEvent(string eventName) private Task RaiseEvent(string eventName)
{ {
// this method name doesnt have Async since it should work as async void. // this method name doesnt have Async since it should work as async void.
if (_eventMap.HasEventHandlers<EventHandler>(eventName)) var ev = _eventMap.GetEventHandlers<EventHandler>(eventName);
if (ev.HasHandlers)
{ {
return _eventQueue.ScheduleTask(() => return _eventQueue.ScheduleTask(() =>
{ {
_eventMap.RaiseEvent<EventHandler>(eventName, handler => handler(this, EventArgs.Empty)); ev.RaiseEvent(handler => handler(this, EventArgs.Empty));
}); });
} }
......
...@@ -49,11 +49,12 @@ public override GlobalOperationRegistration Start(string operation) ...@@ -49,11 +49,12 @@ public override GlobalOperationRegistration Start(string operation)
protected virtual Task RaiseGlobalOperationStarted() protected virtual Task RaiseGlobalOperationStarted()
{ {
if (_eventMap.HasEventHandlers<EventHandler>(GlobalOperationStartedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler>(GlobalOperationStartedEventName);
if (ev.HasHandlers)
{ {
return _eventQueue.ScheduleTask(() => return _eventQueue.ScheduleTask(() =>
{ {
_eventMap.RaiseEvent<EventHandler>(GlobalOperationStartedEventName, handler => handler(this, EventArgs.Empty)); ev.RaiseEvent(handler => handler(this, EventArgs.Empty));
}); });
} }
...@@ -62,13 +63,14 @@ protected virtual Task RaiseGlobalOperationStarted() ...@@ -62,13 +63,14 @@ protected virtual Task RaiseGlobalOperationStarted()
protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList<string> operations, bool cancelled) protected virtual Task RaiseGlobalOperationStopped(IReadOnlyList<string> operations, bool cancelled)
{ {
if (_eventMap.HasEventHandlers<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName);
if (ev.HasHandlers)
{ {
var args = new GlobalOperationEventArgs(operations, cancelled); var args = new GlobalOperationEventArgs(operations, cancelled);
return _eventQueue.ScheduleTask(() => return _eventQueue.ScheduleTask(() =>
{ {
_eventMap.RaiseEvent<EventHandler<GlobalOperationEventArgs>>(GlobalOperationStoppedEventName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
}); });
} }
......
...@@ -53,23 +53,10 @@ public void RemoveEventHandler<TEventHandler>(string eventName, TEventHandler ev ...@@ -53,23 +53,10 @@ public void RemoveEventHandler<TEventHandler>(string eventName, TEventHandler ev
} }
} }
public bool HasEventHandlers<TEventHandler>(string eventName) public EventHandlerSet<TEventHandler> GetEventHandlers<TEventHandler>(string eventName)
where TEventHandler : class where TEventHandler : class
{ {
return this.GetRegistries<TEventHandler>(eventName).Length > 0; return new EventHandlerSet<TEventHandler>(this.GetRegistries<TEventHandler>(eventName));
}
public void RaiseEvent<TEventHandler>(string eventName, Action<TEventHandler> invoker)
where TEventHandler : class
{
var registries = GetRegistries<TEventHandler>(eventName);
if (registries.Length > 0)
{
foreach (var registry in registries)
{
registry.Invoke(invoker);
}
}
} }
private ImmutableArray<Registry<TEventHandler>> GetRegistries<TEventHandler>(string eventName) private ImmutableArray<Registry<TEventHandler>> GetRegistries<TEventHandler>(string eventName)
...@@ -147,5 +134,32 @@ public override int GetHashCode() ...@@ -147,5 +134,32 @@ public override int GetHashCode()
return this.handler.GetHashCode(); return this.handler.GetHashCode();
} }
} }
internal struct EventHandlerSet<TEventHandler>
where TEventHandler : class
{
private ImmutableArray<Registry<TEventHandler>> registries;
internal EventHandlerSet(object registries)
{
this.registries = (ImmutableArray<Registry<TEventHandler>>) registries;
}
public bool HasHandlers
{
get { return this.registries != null && this.registries.Length > 0; }
}
public void RaiseEvent(Action<TEventHandler> invoker)
{
if (this.HasHandlers)
{
foreach (var registry in registries)
{
registry.Invoke(invoker);
}
}
}
}
} }
} }
...@@ -48,12 +48,13 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio ...@@ -48,12 +48,13 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio
projectId = documentId.ProjectId; projectId = documentId.ProjectId;
} }
if (_eventMap.HasEventHandlers<EventHandler<WorkspaceChangeEventArgs>>(WorkspaceChangeEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<WorkspaceChangeEventArgs>>(WorkspaceChangeEventName);
if (ev.HasHandlers)
{ {
return this.ScheduleTask(() => return this.ScheduleTask(() =>
{ {
var args = new WorkspaceChangeEventArgs(kind, oldSolution, newSolution, projectId, documentId); var args = new WorkspaceChangeEventArgs(kind, oldSolution, newSolution, projectId, documentId);
_eventMap.RaiseEvent<EventHandler<WorkspaceChangeEventArgs>>(WorkspaceChangeEventName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
}, "Workspace.WorkspaceChanged"); }, "Workspace.WorkspaceChanged");
} }
else else
...@@ -81,10 +82,11 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio ...@@ -81,10 +82,11 @@ protected Task RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind kind, Solutio
protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic) protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic)
{ {
if (_eventMap.HasEventHandlers<EventHandler<WorkspaceDiagnosticEventArgs>>(WorkspaceFailedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<WorkspaceDiagnosticEventArgs>>(WorkspaceFailedEventName);
if (ev.HasHandlers)
{ {
var args = new WorkspaceDiagnosticEventArgs(diagnostic); var args = new WorkspaceDiagnosticEventArgs(diagnostic);
_eventMap.RaiseEvent<EventHandler<WorkspaceDiagnosticEventArgs>>(WorkspaceFailedEventName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
} }
} }
...@@ -106,12 +108,13 @@ protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic ...@@ -106,12 +108,13 @@ protected internal virtual void OnWorkspaceFailed(WorkspaceDiagnostic diagnostic
protected Task RaiseDocumentOpenedEventAsync(Document document) protected Task RaiseDocumentOpenedEventAsync(Document document)
{ {
if (_eventMap.HasEventHandlers<EventHandler<DocumentEventArgs>>(DocumentOpenedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<DocumentEventArgs>>(DocumentOpenedEventName);
if (ev.HasHandlers)
{ {
return this.ScheduleTask(() => return this.ScheduleTask(() =>
{ {
var args = new DocumentEventArgs(document); var args = new DocumentEventArgs(document);
_eventMap.RaiseEvent<EventHandler<DocumentEventArgs>>(DocumentOpenedEventName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
}, "Workspace.WorkspaceChanged"); }, "Workspace.WorkspaceChanged");
} }
else else
...@@ -138,12 +141,13 @@ protected Task RaiseDocumentOpenedEventAsync(Document document) ...@@ -138,12 +141,13 @@ protected Task RaiseDocumentOpenedEventAsync(Document document)
protected Task RaiseDocumentClosedEventAsync(Document document) protected Task RaiseDocumentClosedEventAsync(Document document)
{ {
if (_eventMap.HasEventHandlers<EventHandler<DocumentEventArgs>>(DocumentClosedEventName)) var ev = _eventMap.GetEventHandlers<EventHandler<DocumentEventArgs>>(DocumentClosedEventName);
if (ev.HasHandlers)
{ {
return this.ScheduleTask(() => return this.ScheduleTask(() =>
{ {
var args = new DocumentEventArgs(document); var args = new DocumentEventArgs(document);
_eventMap.RaiseEvent<EventHandler<DocumentEventArgs>>(DocumentClosedEventName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
}, "Workspace.DocumentClosed"); }, "Workspace.DocumentClosed");
} }
else else
...@@ -171,12 +175,13 @@ protected Task RaiseDocumentClosedEventAsync(Document document) ...@@ -171,12 +175,13 @@ protected Task RaiseDocumentClosedEventAsync(Document document)
protected Task RaiseDocumentActiveContextChangedEventAsync(Document document) protected Task RaiseDocumentActiveContextChangedEventAsync(Document document)
{ {
if (_eventMap.HasEventHandlers<EventHandler<DocumentEventArgs>>(DocumentActiveContextChangedName)) var ev = _eventMap.GetEventHandlers<EventHandler<DocumentEventArgs>>(DocumentActiveContextChangedName);
if (ev.HasHandlers)
{ {
return this.ScheduleTask(() => return this.ScheduleTask(() =>
{ {
var args = new DocumentEventArgs(document); var args = new DocumentEventArgs(document);
_eventMap.RaiseEvent<EventHandler<DocumentEventArgs>>(DocumentActiveContextChangedName, handler => handler(this, args)); ev.RaiseEvent(handler => handler(this, args));
}, "Workspace.WorkspaceChanged"); }, "Workspace.WorkspaceChanged");
} }
else else
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册