Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
 public void BooleanDisposable()
 {
     var d = new BooleanDisposable();
     Assert.IsFalse(d.IsDisposed);
     d.Dispose();
     Assert.IsTrue(d.IsDisposed);
     d.Dispose();
     Assert.IsTrue(d.IsDisposed);
 }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 5
0
        /// <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;
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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();
        }
Ejemplo n.º 11
0
 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);
 }
Ejemplo n.º 12
0
        /// <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;
        }