public void Run(Dispatcher dispatcher, Action todo, bool isFinal, CancelToken cancelToken, Thread subscribingThread) { if ((cancelToken != null) && cancelToken.IsCancellationRequested) { if (this._timer != null) { this._timer.Stop(); } if (subscribingThread == Thread.CurrentThread) { cancelToken.ThrowIfCancelRequested(); } else if (!this._isAborted) { this._isAborted = true; try { subscribingThread.Abort(); } catch { } } } if (this._timer == null) { this._timer = new DispatcherTimer(TimeSpan.FromMilliseconds(50.0), DispatcherPriority.Normal, new EventHandler(this.Tick), dispatcher); this._timer.Start(); } lock (this._locker) { if (isFinal) { this._finalAction = todo; } else { this._action = todo; } } }
public static void DumpLive <T>(IObservable <T> obs, string heading) { ObservablePresenter presenter; OutputPanel outPanel; ManualResetEvent ready; IDisposable extensionToken; Server currentServer = Server.CurrentServer; if (currentServer != null) { object obj2; presenter = null; outPanel = null; ready = new ManualResetEvent(false); Action action = delegate { presenter = new ObservablePresenter(); outPanel = PanelManager.StackWpfElement(WrapInHeading(presenter, heading), "Live &Observables"); ready.Set(); }; lock ((obj2 = _threadLocker)) { if (currentServer != _lastServer) { _lastServer = currentServer; } if (currentServer.IsOnMainQueryThread) { action(); } else { currentServer.RunOnMessageLoopThread(action); } } int num = 0; while (true) { lock ((obj2 = _threadLocker)) { if ((((currentServer != _lastServer) || currentServer.MessageLoopEnded) || currentServer.CancelRequest) || (num++ > 20)) { return; } } if (ready.WaitOne(500, false)) { extensionToken = Util.GetQueryLifeExtensionToken(); try { IDisposable subscription = null; CancelToken cancelToken = new CancelToken(); Action cancel = delegate { IDisposable disposable1 = subscription; if (disposable1 != null) { disposable1.Dispose(); } else { cancelToken.Cancel(); } }; outPanel.QueryEnded += delegate(object sender, EventArgs e) { cancel(); if (!(!outPanel.IsQueryCanceled || outPanel.IsPanelClosing)) { presenter.SetCanceled(); } }; outPanel.PanelClosed += delegate(object sender, EventArgs e) { cancel(); extensionToken.Dispose(); }; Action subscribe = delegate { Action <T> onNext = null; Action <Exception> onError = null; Action onCompleted = null; try { if (onNext == null) { onNext = val => base.CS$ < > 8__localsd.presenter.SetNext(val); } if (onError == null) { onError = delegate(Exception ex) { base.CS$ < > 8__localsd.presenter.SetError(ex); base.CS$ < > 8__localsd.extensionToken.Dispose(); }; } if (onCompleted == null) { onCompleted = delegate { base.CS$ < > 8__localsd.presenter.SetComplete(); base.CS$ < > 8__localsd.extensionToken.Dispose(); }; } subscription = Subscribe <T>(obs, onNext, onError, onCompleted, presenter.Dispatcher, cancelToken); if (cancelToken.IsCancellationRequested) { subscription.Dispose(); } } catch (Exception exception) { if (subscription != null) { subscription.Dispose(); } if (exception is ThreadAbortException) { Thread.ResetAbort(); } else if (!(exception is OperationCanceledException)) { Log.Write(exception, "Rx Subscription Failure"); exception.Dump <Exception>(); } } }; new Thread(delegate { bool flag = false; try { flag = RunOnRxScheduler(subscribe); } catch (Exception exception) { Log.Write(exception); } if (!flag) { subscribe(); } }) { IsBackground = true, Name = "Rx Subscriber" }.Start(); } catch { extensionToken.Dispose(); } return; } } } }
public static IDisposable Subscribe <TSource>(IObservable <TSource> source, Action <TSource> onNext, Action <Exception> onError, Action onCompleted, Dispatcher dispatcher, CancelToken cancelToken) { DispatcherThrottler throttler = new DispatcherThrottler(); Thread subscribingThread = Thread.CurrentThread; return(ObservableHelper.Subscribe <TSource>(source, delegate(TSource item) { throttler.Run(dispatcher, () => onNext(item), false, cancelToken, subscribingThread); }, delegate(Exception ex) { throttler.Run(dispatcher, () => onError(ex), true, null, null); }, delegate { throttler.Run(dispatcher, onCompleted, true, null, null); })); }