コード例 #1
0
 public static Task Delay(this IMomentClock clock, long dueInMilliseconds, CancellationToken cancellationToken = default)
 {
     if (dueInMilliseconds == Timeout.Infinite)
     {
         return(clock.Delay(Timeout.InfiniteTimeSpan, cancellationToken));
     }
     if (dueInMilliseconds < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(dueInMilliseconds));
     }
     return(clock.Delay(TimeSpan.FromMilliseconds(dueInMilliseconds), cancellationToken));
 }
コード例 #2
0
    public static IObservable <long> Interval(this IMomentClock clock, IEnumerable <TimeSpan> intervals)
    {
        var e = intervals.GetEnumerator();

        return(Observable.Create <long>(async(observer, ct) => {
            var completed = false;
            try {
                var index = 0L;
                while (e.MoveNext())
                {
                    var dueAt = clock.Now + e.Current;
                    await clock.Delay(dueAt, ct).SuppressCancellation().ConfigureAwait(false);
                    if (ct.IsCancellationRequested)
                    {
                        break;
                    }
                    observer.OnNext(index++);
                }
                completed = true;
                observer.OnCompleted();
            }
            catch (Exception e) {
                if (!completed)
                {
                    observer.OnError(e);
                }
            }
            finally {
                e.Dispose();
            }
        }));
    }
コード例 #3
0
 public static IObservable <long> Timer(this IMomentClock clock, TimeSpan dueIn)
 {
     if (clock is SystemClock)
     {
         return(Observable.Timer(dueIn)); // Perf. optimization
     }
     return(Observable.Create <long>(async observer => {
         var completed = false;
         try {
             await clock.Delay(dueIn).ConfigureAwait(false);
             observer.OnNext(0);
             completed = true;
             observer.OnCompleted();
         }
         catch (Exception e) {
             if (!completed)
             {
                 observer.OnError(e);
             }
         }
     }));
 }
コード例 #4
0
 public static Task Delay(this IMomentClock clock, Moment dueAt, CancellationToken cancellationToken = default)
 => clock.Delay((dueAt - clock.Now).NonNegative(), cancellationToken);