public static void Notify(K key, V arg, string groupId = "") { var group = BroadcastTunnel <K, V> .GetGroup(groupId); if (null == group) { return; } Manager mgr; if (group.TryGetValue(key, out mgr)) { BroadcastTunnel <K, V> .DoNotify(mgr, arg); } }
static void DoNotify(Manager mgr, V arg) { var queue = mgr.queue; if (0 < queue.Count) { mgr.nextCall.AddLast(arg); return; } var enumerator = mgr.container.GetEnumerator(); while (enumerator.MoveNext()) { queue.AddLast(enumerator.Current); } var node = queue.First; var nodeTemp = node; while (null != node) { var action = node.Value; nodeTemp = node; node = node.Next; queue.Remove(nodeTemp); if (null != action) { action(arg); } } if (0 < mgr.nextCall.Count) { var nextCallNode = mgr.nextCall.First; var nextCallArg = nextCallNode.Value; mgr.nextCall.Remove(nextCallNode); BroadcastTunnel <K, V> .DoNotify(mgr, nextCallArg); } }