ChannelCollection.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Collections.Concurrent;
  2. using Vinno.IUS.Common.Log;
  3. namespace Vinno.IUS.Common.Network.Channels
  4. {
  5. /// <summary>
  6. /// ChannelCollection is used for storing the channel of one leaf.
  7. /// This can avoid GC to release the channel.
  8. /// </summary>
  9. internal class ChannelCollection
  10. {
  11. private readonly ConcurrentDictionary<int,IChannel> _channels = new ConcurrentDictionary<int, IChannel>();
  12. /// <summary>
  13. /// Gets the channels count.
  14. /// </summary>
  15. public int Count => _channels.Count;
  16. /// <summary>
  17. /// Add channel into collection.
  18. /// </summary>
  19. /// <param name="channel"></param>
  20. public void AddChannel(IChannel channel)
  21. {
  22. _channels.TryAdd(channel.Id, channel);
  23. }
  24. /// <summary>
  25. /// Remove channel from collection.
  26. /// </summary>
  27. /// <param name="channel"></param>
  28. public void RemoveChannel(IChannel channel)
  29. {
  30. _channels.TryRemove(channel.Id, out var existChannel);
  31. if (existChannel == null)
  32. {
  33. Logger.WriteLineWarn($"Channel:{channel.Id} not found in collection");
  34. }
  35. }
  36. /// <summary>
  37. /// Close all channels.
  38. /// </summary>
  39. public void Close()
  40. {
  41. foreach (var channel in _channels.Values)
  42. {
  43. channel.Close();
  44. }
  45. _channels.Clear();
  46. }
  47. }
  48. }