コード例 #1
0
 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;
         }
     }
 }
コード例 #2
0
 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;
         }
     }
 }
コード例 #3
0
        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;
                    }
                }
            }
        }
コード例 #4
0
        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);
            }));
        }