1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- using System.Collections.Concurrent;
- using Vinno.IUS.Common.Log;
- namespace Vinno.IUS.Common.Network.Channels
- {
- /// <summary>
- /// ChannelCollection is used for storing the channel of one leaf.
- /// This can avoid GC to release the channel.
- /// </summary>
- internal class ChannelCollection
- {
- private readonly ConcurrentDictionary<int,IChannel> _channels = new ConcurrentDictionary<int, IChannel>();
- /// <summary>
- /// Gets the channels count.
- /// </summary>
- public int Count => _channels.Count;
- /// <summary>
- /// Add channel into collection.
- /// </summary>
- /// <param name="channel"></param>
- public void AddChannel(IChannel channel)
- {
- _channels.TryAdd(channel.Id, channel);
- }
- /// <summary>
- /// Remove channel from collection.
- /// </summary>
- /// <param name="channel"></param>
- public void RemoveChannel(IChannel channel)
- {
- _channels.TryRemove(channel.Id, out var existChannel);
- if (existChannel == null)
- {
- Logger.WriteLineWarn($"Channel:{channel.Id} not found in collection");
- }
- }
- /// <summary>
- /// Close all channels.
- /// </summary>
- public void Close()
- {
- foreach (var channel in _channels.Values)
- {
- channel.Close();
- }
- _channels.Clear();
- }
- }
- }
|