//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System; using System.Collections.Generic; using System.ServiceModel.Channels; class SynchronizedChannelCollection : SynchronizedCollection where TChannel : IChannel { EventHandler onChannelClosed; EventHandler onChannelFaulted; internal SynchronizedChannelCollection(object syncRoot) : base(syncRoot) { this.onChannelClosed = new EventHandler(OnChannelClosed); this.onChannelFaulted = new EventHandler(OnChannelFaulted); } void AddingChannel(TChannel channel) { channel.Faulted += this.onChannelFaulted; channel.Closed += this.onChannelClosed; } void RemovingChannel(TChannel channel) { channel.Faulted -= this.onChannelFaulted; channel.Closed -= this.onChannelClosed; } void OnChannelClosed(object sender, EventArgs args) { TChannel channel = (TChannel)sender; this.Remove(channel); } void OnChannelFaulted(object sender, EventArgs args) { TChannel channel = (TChannel)sender; this.Remove(channel); } protected override void ClearItems() { List items = this.Items; for (int i = 0; i < items.Count; i++) { this.RemovingChannel(items[i]); } base.ClearItems(); } protected override void InsertItem(int index, TChannel item) { this.AddingChannel(item); base.InsertItem(index, item); } protected override void RemoveItem(int index) { TChannel oldItem = this.Items[index]; base.RemoveItem(index); this.RemovingChannel(oldItem); } protected override void SetItem(int index, TChannel item) { TChannel oldItem = this.Items[index]; this.AddingChannel(item); base.SetItem(index, item); this.RemovingChannel(oldItem); } } }