public void dispatchChange(T change, ChangeType type) { change.type = type; int lastDispatchCount = change.dispatchCount; change.dispatchCount += 1; if (callbacksByChangeType.ContainsKey(type)) { List <Action <T> > list = callbacksByChangeType[type]; int i; for (i = 0; i < list.Count; i += 1) { list[i](change); if (change.isPropagandationStopped) { break; } } } if (lastDispatchCount == 0) //защита на случай если в процессе дёргания слушателей это же событие отдиспатчат ещё раз. { pool.release(change); } }