/// <summary> /// Schedules action to be executed. /// </summary> public IDisposable Schedule(Action action) { if (action == null) throw new ArgumentNullException("action"); var cancelable = new BooleanDisposable(); if (queue == null) { try { queue = new Queue<Action>(); action(); while (queue.Count > 0) queue.Dequeue()(); } finally { queue = null; } } else { queue.Enqueue(() => { if (!cancelable.IsDisposed) action(); }); } return cancelable; }
public void BooleanDisposable() { var d = new BooleanDisposable(); Assert.IsFalse(d.IsDisposed); d.Dispose(); Assert.IsTrue(d.IsDisposed); d.Dispose(); Assert.IsTrue(d.IsDisposed); }
/// <summary> /// Schedules action to be executed on the message loop associated with the control. /// </summary> public IDisposable Schedule(Action action) { if (action == null) throw new ArgumentNullException("action"); var cancelable = new BooleanDisposable(); control.BeginInvoke(new Action(() => { if (!cancelable.IsDisposed) action(); })); return cancelable; }
/// <summary> /// Schedules action to be executed. /// </summary> public IDisposable Schedule(Action action) { if (action == null) throw new ArgumentNullException("action"); var d = new BooleanDisposable(); context.Post(_ => { if (!d.IsDisposed) action(); }, null); return d; }
/// <summary> /// Schedules action to be executed. /// </summary> public IDisposable Schedule(Action action) { if (action == null) throw new ArgumentNullException("action"); var cancelable = new BooleanDisposable(); ThreadPool.QueueUserWorkItem(_ => { if (!cancelable.IsDisposed) action(); }, null); return cancelable; }
/// <summary> /// Schedules action to be executed. /// </summary> public IDisposable Schedule(Action action) { if (action == null) throw new ArgumentNullException("action"); var d = new BooleanDisposable(); var thread = new Thread(() => { if (!d.IsDisposed) action(); }); thread.Start(); return d; }
public IDisposable Schedule(Action action, ushort dueTime) { if (dueTime == 0) dueTime = 1; var disposable = new BooleanDisposable(); var runAt = (ushort)Math.Min(Ticks + dueTime, ushort.MaxValue); var run = new Action(() => { if (!disposable.IsDisposed) action(); }); queue.Enqueue(new Item(runAt, scheduled++, run)); return disposable; }
public void ScheduledDisposable() { var d = new BooleanDisposable(); var s = new ScheduledDisposable(Scheduler.Immediate, d); Assert.IsFalse(d.IsDisposed); Assert.AreSame(Scheduler.Immediate, s.Scheduler); Assert.AreSame(d, s.Disposable); s.Dispose(); Assert.IsTrue(d.IsDisposed); Assert.AreSame(Scheduler.Immediate, s.Scheduler); Assert.AreSame(d, s.Disposable); }
public void RefCountDisposable_PrimaryDisposesFirst() { var d = new BooleanDisposable(); var r = new RefCountDisposable(d); Assert.IsFalse(d.IsDisposed); var d1 = r.GetDisposable(); var d2 = r.GetDisposable(); Assert.IsFalse(d.IsDisposed); d1.Dispose(); Assert.IsFalse(d.IsDisposed); r.Dispose(); Assert.IsFalse(d.IsDisposed); d2.Dispose(); Assert.IsTrue(d.IsDisposed); }
public void RefCountDisposable_RefCounting() { var d = new BooleanDisposable(); var r = new RefCountDisposable(d); Assert.IsFalse(d.IsDisposed); var d1 = r.GetDisposable(); var d2 = r.GetDisposable(); Assert.IsFalse(d.IsDisposed); d1.Dispose(); Assert.IsFalse(d.IsDisposed); d2.Dispose(); Assert.IsFalse(d.IsDisposed); // CHECK r.Dispose(); Assert.IsTrue(d.IsDisposed); var d3 = r.GetDisposable(); // CHECK d3.Dispose(); }
public void RefCountDisposable_SingleReference() { var d = new BooleanDisposable(); var r = new RefCountDisposable(d); Assert.IsFalse(d.IsDisposed); r.Dispose(); Assert.IsTrue(d.IsDisposed); r.Dispose(); Assert.IsTrue(d.IsDisposed); }
/// <summary> /// Schedules action to be executed after dueTime. /// </summary> public IDisposable Schedule(Action action, TimeSpan dueTime) { if (action == null) throw new ArgumentNullException("action"); var dt = Scheduler.Normalize(dueTime); var cancelable = new BooleanDisposable(); if (queue == null) { try { queue = new Queue<Action>(); Thread.Sleep(dt); action(); while (queue.Count > 0) queue.Dequeue()(); } finally { queue = null; } } else { queue.Enqueue(() => { if (!cancelable.IsDisposed) { Thread.Sleep(dt); if (!cancelable.IsDisposed) { action(); } } }); } return cancelable; }