/// <summary> /// Removes wires between server and client components (as defined in correlation set). /// </summary> /// <param name="type">Type of the server component</param> /// <param name="eventStub"><see cref="EventStub"/> with cached subscriptions.</param> /// <param name="delegateCorrelationSet">Correlation set with wiring information</param> /// <param name="wiringList">List with known wirings</param> private void RemoveClientServerWires(Type type, EventStub eventStub, IEnumerable <DelegateCorrelationInfo> delegateCorrelationSet, Dictionary <Guid, Delegate> wiringList) { if (delegateCorrelationSet == null) { return; } var currentSession = ServerSession.CurrentSession; foreach (var correlationInfo in delegateCorrelationSet) { if (wiringList.ContainsKey(correlationInfo.CorrelationID)) { lock (wiringList) { if (!wiringList.ContainsKey(correlationInfo.CorrelationID)) { continue; } var dynamicWireDelegate = wiringList[correlationInfo.CorrelationID]; eventStub.RemoveHandler(correlationInfo.DelegateMemberName, dynamicWireDelegate); wiringList.Remove(correlationInfo.CorrelationID); var dynamicWire = DynamicWireFactory.GetDynamicWire(dynamicWireDelegate); if (dynamicWire != null) { dynamicWire.Dispose(); } } _host.OnSubscriptionRemoved(new SubscriptionEventArgs { ComponentType = type, DelegateMemberName = correlationInfo.DelegateMemberName, CorrelationID = correlationInfo.CorrelationID, }); } } if (currentSession != null) { currentSession.UntrackRemoteSubscriptions(delegateCorrelationSet); } }