public DeferredHandlingSettings([NotNull] IEventHandlingSettings origin, DelayUntil delayUntil) : base(origin.Type, origin.Priority) { deferredAction = ev => { if (ev == null) { throw new ArgumentNullException("ev"); } if (Type.IsInstanceOfType(ev)) { var context = InternalEnvironment.DataContextSupervisor.CurrentContext; if (context != null) { EventHandler<FinishedEventArgs> action = null; action = (sender, e) => { try { // ReSharper disable AccessToModifiedClosure switch (delayUntil) { case DelayUntil.PreCompleted: context.BeforeCompleted -= action; break; case DelayUntil.Completed: context.AfterCompleted -= action; break; case DelayUntil.Finished: context.Finished -= action; break; } if (e.Completed) { // ReSharper restore AccessToModifiedClosure origin.Action(ev); } } finally { context = null; action = null; } }; switch (delayUntil) { case DelayUntil.PreCompleted: context.BeforeCompleted += action; break; case DelayUntil.Completed: context.AfterCompleted += action; break; case DelayUntil.Finished: context.Finished += action; break; } } else { Trace.TraceWarning("Taijutsu: Source of event is outside of unit of work, event is skipped."); } } }; }
public BatchedHandlingSettings([NotNull] Type type, DelayUntil delayUntil, int priority) : base(type, priority) { this.delayUntil = delayUntil; Unique = true; batchedAction = ev => { if (ev == null) { throw new ArgumentNullException("ev"); } if (Type.IsInstanceOfType(ev)) { var context = InternalEnvironment.DataContextSupervisor.CurrentContext; if (context != null) { var extension = InitializeExtension(context); if (!extension.ContainsKey(this)) { extension[this] = new List<object>(); EventHandler<FinishedEventArgs> action = null; action = (sender, e) => { try { // ReSharper disable AccessToModifiedClosure switch (delayUntil) { case DelayUntil.PreCompleted: context.BeforeCompleted -= action; break; case DelayUntil.Completed: context.AfterCompleted -= action; break; case DelayUntil.Finished: context.Finished -= action; break; } var events = (List<object>)extension[this]; extension.Remove(this); // ReSharper restore AccessToModifiedClosure if (events.Count > 0 && e.Completed) { Events.Publish(ResolveConstructor()(events)); } } finally { context = null; action = null; extension = null; } }; switch (delayUntil) { case DelayUntil.PreCompleted: context.BeforeCompleted += action; break; case DelayUntil.Completed: context.AfterCompleted += action; break; case DelayUntil.Finished: context.Finished += action; break; } } ((List<object>)extension[this]).Add(ev); } else { Trace.TraceWarning("Taijutsu: Source of event is outside of unit of work, event is skipped."); } } }; }