public IDisposable Schedule(TimeSpan dueTime, Action action) { if (action == null) { throw new ArgumentNullException("action"); } var dt = Time + Scheduler.Normalize(dueTime); var si = new ScheduledItem(action, dt); var queue = GetQueue(); if (queue == null) { queue = new SchedulerQueue(4); queue.Enqueue(si); CurrentThreadScheduler.SetQueue(queue); try { Trampoline.Run(queue); } finally { CurrentThreadScheduler.SetQueue(null); } } else { queue.Enqueue(si); } return(si.Cancellation); }
/*NotSupportedException: IL2CPP encountered a managed type which it cannot convert ahead-of-time. The type uses generic or array types which are nested beyond the maximum depth which can be converted. * at System.Reactive.Concurrency.Scheduler.ScheduleAction[TState] (System.Reactive.Concurrency.IScheduler scheduler, TState state, System.Action`1[T] action) [0x00000] in <00000000000000000000000000000000>:0 * at System.Reactive.Producer`2[TTarget,TSink].SubscribeRaw (System.IObserver`1[T] observer, System.Boolean enableSafeguard) [0x00000] in <00000000000000000000000000000000>:0 * at TryToDoAThing.RunAttempt (System.Int32 whichAttempt) [0x00000] in <00000000000000000000000000000000>:0 * at TryToDoAThing.RunButton () [0x00000] in <00000000000000000000000000000000>:0 */ public static void GenScheduleAction0 <T>() { // var x = default(ValueTuple<T,T>); CurrentThreadScheduler s = null; s.ScheduleAction <T>(default(T), null); }
//public static IDisposable ScheduleAbsolute(this TestScheduler scheduler, long time, Action action) //{ // return scheduler.ScheduleAbsolute(default(object), time, (scheduler1, state1) => { action(); return Disposable.Empty; }); //} //public static IDisposable ScheduleRelative(this TestScheduler scheduler, long time, Action action) //{ // return scheduler.ScheduleRelative(default(object), time, (scheduler1, state1) => { action(); return Disposable.Empty; }); //} public static void EnsureTrampoline(this CurrentThreadScheduler scheduler, Action action) { if (scheduler.ScheduleRequired) { scheduler.Schedule(action); } else { action(); } }
/** * Scheduler控制订阅和通知的发送。 * Scheduler包含三个组件:1)一个优先队列存放任务,2)Execution context,用来决定任务在哪执行(线程池,当前线程)3)scheduler的时钟,Task是根据这个时钟调度的,不是系统时钟。 * * rx中所有的Scheduler实现IScheduler接口。 * */ public static void GetSchedulers() { //立刻在当前线程上执行 ImmediateScheduler immediate = Scheduler.Immediate; //在当前线程上尽可能快的执行(先放到队列中,尽快执行) CurrentThreadScheduler currentThreadScheduler = Scheduler.CurrentThread; //每次创建一个线程执行 NewThreadScheduler newThreadScheduler = NewThreadScheduler.Default; //在Task Factory上执行 TaskPoolScheduler taskPoolScheduler = TaskPoolScheduler.Default; //在当前Dispatcher上执行任务 DispatcherScheduler dispatcherScheduler = DispatcherScheduler.Current; //在ThreadPool上执行 ThreadPoolScheduler threadPoolScheduler = ThreadPoolScheduler.Instance; //默认的调度器 其原则是使用最小的并行性,for operators returning an observable with a finite and small number of messages, Rx calls Immediate. For operators returning a potentially large or infinite number of messages, CurrentThread is called. For operators which use timers, ThreadPool is used. DefaultScheduler defaultScheduler = Scheduler.Default; }