예제 #1
0
        /// <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);
            }
        }