public IDisposable SchedulePeriodically(Action action, TimeSpan initialDelay, TimeSpan period)
                {
                    MultipleAssignmentDisposable inner = new MultipleAssignmentDisposable();

                    MultipleAssignmentDisposable outer = new MultipleAssignmentDisposable(inner);

                    if (tasks.Add(outer))
                    {
                        IDisposable cancel = new ActionWeakDisposable(() => tasks.Remove(outer));

                        long startTime = NowUtc() + (long)initialDelay.TotalMilliseconds;

                        long periodMillis = (long)period.TotalMilliseconds;

                        long[] count = new long[1];

                        Action nextAction = null;

                        nextAction = () =>
                        {
                            if (!outer.IsDisposed())
                            {
                                action();

                                long now = NowUtc();

                                long c    = ++count[0];
                                long next = startTime + c * periodMillis;

                                long toDelay = Math.Max(0, next - startTime);

                                outer.Set(Schedule(nextAction, TimeSpan.FromMilliseconds(toDelay)));
                            }
                        };

                        IDisposable f = Task.Delay(initialDelay).ContinueWith(a =>
                        {
                            if (!outer.IsDisposed())
                            {
                                outer.Set(Schedule(nextAction));
                            }
                        });

                        inner.Set(f);

                        return(cancel);
                    }
                    return(EmptyDisposable.Instance);
                }
Example #2
0
        public static ICompletable ToCompletable(this Task task)
        {
            return(Create(cs =>
            {
                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable();

                cs.OnSubscribe(mad);

                IDisposable d = task.ContinueWith(t =>
                {
                    Exception e = t.Exception;

                    if (e == null)
                    {
                        cs.OnComplete();
                    }
                    else
                    {
                        cs.OnError(e);
                    }
                });

                mad.Set(d);
            }));
        }
Example #3
0
        public static ISingle <long> Timer(TimeSpan delay, IScheduler scheduler)
        {
            return(Create <long>(s =>
            {
                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable();

                s.OnSubscribe(mad);

                mad.Set(scheduler.ScheduleDirect(() => s.OnSuccess(0), delay));
            }));
        }
Example #4
0
 public static ICompletable Timer(TimeSpan time, IScheduler scheduler)
 {
     return(Create(cs =>
     {
         MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable();
         cs.OnSubscribe(mad);
         if (!mad.IsDisposed())
         {
             mad.Set(scheduler.ScheduleDirect(() => cs.OnComplete()));
         }
     }));
 }
Example #5
0
        public static ISingle <T> SubscribeOn <T>(this ISingle <T> source, IScheduler scheduler)
        {
            return(Create <T>(s =>
            {
                MultipleAssignmentDisposable inner = new MultipleAssignmentDisposable();

                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable(inner);

                inner.Set(scheduler.ScheduleDirect(() =>
                {
                    source.Subscribe(new SingleSubscriberWrapper <T>(s, mad));
                }));
            }));
        }
Example #6
0
        public static ICompletable DelaySubscription(this ICompletable source, TimeSpan delay, IScheduler scheduler)
        {
            return(Create(cs =>
            {
                MultipleAssignmentDisposable t = new MultipleAssignmentDisposable();

                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable(t);

                cs.OnSubscribe(mad);

                t.Set(scheduler.ScheduleDirect(() => {
                    source.Subscribe(new SubscribeOnCompletableSubscriber(cs, mad));
                }, delay));
            }));
        }
Example #7
0
        public static ISingle <T> DelaySubscription <T>(this ISingle <T> source, TimeSpan delay, IScheduler scheduler)
        {
            return(Create <T>(s =>
            {
                MultipleAssignmentDisposable inner = new MultipleAssignmentDisposable();

                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable(inner);

                s.OnSubscribe(mad);

                inner.Set(scheduler.ScheduleDirect(() => {
                    source.Subscribe(new SingleSubscriberWrapper <T>(s, mad));
                }, delay));
            }));
        }
Example #8
0
        public static ICompletable SubscribeOn(this ICompletable source, IScheduler scheduler)
        {
            return(Create(cs =>
            {
                MultipleAssignmentDisposable inner = new MultipleAssignmentDisposable();

                MultipleAssignmentDisposable outer = new MultipleAssignmentDisposable(inner);

                cs.OnSubscribe(outer);

                inner.Set(scheduler.ScheduleDirect(() =>
                {
                    source.Subscribe(new SubscribeOnCompletableSubscriber(cs, outer));
                }));
            }));
        }
Example #9
0
        public static ISingle <T> ToSingle <T>(this Task <T> task)
        {
            return(Create <T>(s =>
            {
                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable();

                s.OnSubscribe(mad);

                mad.Set(task.ContinueWith(t =>
                {
                    Exception e = t.Exception;
                    if (e != null)
                    {
                        s.OnError(e);
                    }
                    else
                    {
                        s.OnSuccess(t.Result);
                    }
                }));
            }));
        }
                public IDisposable Schedule(Action action, TimeSpan delay)
                {
                    MultipleAssignmentDisposable inner = new MultipleAssignmentDisposable();

                    MultipleAssignmentDisposable outer = new MultipleAssignmentDisposable(inner);

                    if (tasks.Add(outer))
                    {
                        IDisposable cancel = new ActionWeakDisposable(() => tasks.Remove(outer));

                        IDisposable f = Task.Delay(delay).ContinueWith(a =>
                        {
                            if (!outer.IsDisposed())
                            {
                                outer.Set(Schedule(action));
                            }
                        });

                        inner.Set(f);

                        return(cancel);
                    }
                    return(EmptyDisposable.Instance);
                }
            public override IDisposable Schedule(IRunnable action, TimeSpan delay)
            {
                MultipleAssignmentDisposable first = new MultipleAssignmentDisposable();
                MultipleAssignmentDisposable mad = new MultipleAssignmentDisposable(first);

                IDisposable d = Task.Delay(delay).ContinueWith(t => {
                    IDisposable d1 = Schedule(action);
                    mad.Set(d1);
                });

                first.Set(d);

                return mad;
            }
Example #12
0
 public void OnSubscribe(IDisposable d)
 {
     mad.Set(d);
 }