| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | // Licensed to the .NET Foundation under one or more agreements.// The .NET Foundation licenses this file to you under the MIT License.// See the LICENSE file in the project root for more information. using System;using System.Reactive.Concurrency;using System.Reactive.Disposables;using System.Threading;using System.Threading.Tasks;namespace ReactiveTests{    internal class TestLongRunningScheduler : IScheduler, ISchedulerLongRunning, IServiceProvider    {        private readonly Action<ManualResetEvent> _setStart;        private readonly Action<ManualResetEvent> _setEnd;        private readonly Action<Exception> _setException;        public TestLongRunningScheduler(Action<ManualResetEvent> setStart, Action<ManualResetEvent> setEnd)            : this(setStart, setEnd, null)        {        }        public TestLongRunningScheduler(Action<ManualResetEvent> setStart, Action<ManualResetEvent> setEnd, Action<Exception> setException)        {            _setStart = setStart;            _setEnd = setEnd;            _setException = setException;        }        public DateTimeOffset Now        {            get { return DateTimeOffset.Now; }        }        public IDisposable Schedule<TState>(TState state, Func<IScheduler, TState, IDisposable> action)        {            throw new NotImplementedException();        }        public IDisposable Schedule<TState>(TState state, TimeSpan dueTime, Func<IScheduler, TState, IDisposable> action)        {            throw new NotImplementedException();        }        public IDisposable Schedule<TState>(TState state, DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable> action)        {            throw new NotImplementedException();        }        public IDisposable ScheduleLongRunning<TState>(TState state, Action<TState, ICancelable> action)        {            var d = new BooleanDisposable();            var eb = new ManualResetEvent(false);            _setStart(eb);            var ee = new ManualResetEvent(false);            _setEnd(ee);            Task.Run(() =>            {                eb.Set();                try                {                    action(state, d);                }                catch (Exception ex)                {                    if (_setException == null)                    {                        throw;                    }                    _setException(ex);                }                finally                {                    ee.Set();                }            });            return d;        }        object IServiceProvider.GetService(Type serviceType)        {            if (serviceType == typeof(ISchedulerLongRunning))            {                return this;            }            return null;        }    }}
 |