public void Subscribe(ISingleObserver <T> observer)
        {
            var parent = new TimeoutObserver(observer, fallback);

            observer.OnSubscribe(parent);
            parent.SetTask(scheduler.Schedule(parent, timeout, RUN));
            source.Subscribe(parent);
        }
        public void Subscribe(ISignalObserver <T> observer)
        {
            var parent = new TimeoutObserver(observer, timeout, scheduler, fallback);

            observer.OnSubscribe(parent);

            parent.StartTimer(0);

            source.Subscribe(parent);
        }
Example #3
0
            private void SetTimer(IObservable <TTimeout> timeout, long idx)
            {
                var timeoutObserver = new TimeoutObserver(this, idx);

                if (Disposable.TrySetSerial(ref _timerDisposable, timeoutObserver))
                {
                    var d = timeout.Subscribe(timeoutObserver);
                    timeoutObserver.SetResource(d);
                }
            }
Example #4
0
        /// <summary>
        /// 活动处理超时。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timeoutObserver_OnTick(object sender, EventArgs e)
        {
            this.timeoutObserver = null;

            if (_state == ActionState.Processing || _state == ActionState.Hangup)
            {
                ActionTimout();
            }
        }
Example #5
0
        /// <summary>
        /// 复位运行时数据。
        /// </summary>
        private void ResetRuntimeData()
        {
            try
            {
                _activateTime = null;
                _deactivateTime = null;

                if (timeoutObserver != null)
                {
                    timeoutObserver.Stop();
                    timeoutObserver = null;
                }

                resultEventArgs = null;
                faultEventArgs = null;
            }
            catch
            {
                //不处理。
            }
        }
Example #6
0
 protected override void ClearUnmanagedResources()
 {
     if (timeoutObserver != null)
     {
         timeoutObserver.Stop();
         timeoutObserver = null;
     }
     if (light != null)
     {
         light.Dispose();
         light = null;
     }
 }
Example #7
0
        /// <summary>
        /// 失败。因为存在状态判断,未防止子类覆盖后出现状态漏判,故不允许子类覆盖改方法。
        /// </summary>
        /// <param name="eventArgs">事件参数</param>
        public virtual void Fault(ActionFaultEventArgs eventArgs)
        {
            if (_state == ActionState.Processing || _state == ActionState.Hangup)
            {
                _state = ActionState.Fault;
                _deactivateTime = DateTime.Now;

                if (timeoutObserver != null)
                {
                    timeoutObserver.Stop();
                    timeoutObserver = null;
                }

                faultEventArgs = eventArgs;

                if (light != null)
                {
                    light.TurnOn();
                }

                if (OnFault != null)
                {
                    OnFault(this, faultEventArgs);
                }

                InnerFault(eventArgs);
            }
        }
Example #8
0
        /// <summary>
        /// 完成。因为存在状态判断,未防止子类覆盖后出现状态漏判,故不允许子类覆盖改方法。
        /// </summary>
        /// <param name="result"></param>
        public void Complete(object result)
        {
            if (_state == ActionState.Processing || _state == ActionState.Hangup)
            {
                _state = ActionState.Completed;
                _deactivateTime = DateTime.Now;

                if (timeoutObserver != null)
                {
                    timeoutObserver.Stop();
                    timeoutObserver = null;
                }

                resultEventArgs = new ActionResultEventArgs(this, result);

                if (light != null)
                {
                    light.TurnOn();
                }

                if (OnComplete != null)
                {
                    OnComplete(this, resultEventArgs);
                }

                InnerComplete(result);
            }
        }
Example #9
0
        /// <summary>
        /// 异步方式执行活动。
        /// </summary>
        /// <param name="bWaitForComplete"></param>
        /// <returns></returns>
        public ActionExecuteResult AsyncExecute(bool bWaitForComplete)
        {
            try
            {
                ResetRuntimeData();

                _state = ActionState.Processing;

                _activateTime = DateTime.Now;

                if (bWaitForComplete)
                {
                    light = new LightObject(Guid.NewGuid().ToString("N"), false, false, IntPtr.Zero, null);

                    InnerExecute();

                    WaitResult waitResult = light.Wait(_executeTimeout, false);
                    if (waitResult == WaitResult.TimeOut)
                    {
                        ActionTimout();
                    }

                    light.Dispose();
                    light = null;

                    return new ActionExecuteResult(resultEventArgs, faultEventArgs);
                }
                else
                {
                    if (_executeTimeout > 0)
                    {
                        this.timeoutObserver = new TimeoutObserver();
                        this.timeoutObserver.OnTick += new EventHandler(timeoutObserver_OnTick);
                        this.timeoutObserver.Execute(_executeTimeout);
                    }

                    InnerExecute();

                    return null;
                }
            }
            catch (Exception ex)
            {
                Fault(ActionErrorCodes.UNKNOWN_ERROR, ex);

                if (bWaitForComplete)
                {
                    return new ActionExecuteResult(resultEventArgs, faultEventArgs);
                }
                else
                {
                    return null;
                }
            }
        }