/// <summary>
        /// see RepeatTemplate#WaitForResults
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        protected override bool WaitForResults(IRepeatInternalState state)
        {
            IResultQueue <IResultHolder> queue = ((ResultQueueInternalState)state).ResultQueue;
            bool result = true;

            while (queue.IsExpecting())
            {
                // Careful that no runnables that are not going to finish ever get
                // onto the queue, else this may block forever.
                IResultHolder future;
                try
                {
                    future = queue.Take();
                }
                catch (ThreadInterruptedException)
                {
                    Thread.CurrentThread.Interrupt();
                    throw new RepeatException("InterruptedException while waiting for result.");
                }

                if (future.Error != null)
                {
                    state.GetExceptions().Add(future.Error);
                    result = false;
                }
                else
                {
                    RepeatStatus status = future.Result;
                    result = result && CanContinue(status);
                    ExecuteAfterInterceptors(future.Context, status);
                }
            }
            Assert.State(queue.IsEmpty(), "Future results queue should be empty at end of batch.");
            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// @see ITasklet#Execute.
        /// </summary>
        /// <param name="contribution"></param>
        /// <param name="chunkContext"></param>
        /// <returns></returns>
        public RepeatStatus Execute(StepContribution contribution, ChunkContext chunkContext)
        {
            Chunk <TI> inputs = (Chunk <TI>)chunkContext.GetAttribute(InputsKey);

            if (inputs == null)
            {
                inputs = _chunkProvider.Provide(contribution);
                if (_buffering)
                {
                    chunkContext.SetAttribute(InputsKey, inputs);
                }
            }

            _chunkProcessor.Process(contribution, inputs);
            _chunkProvider.PostProcess(contribution, inputs);

            // Allow a message coming back from the processor to say that we
            // are not done yet
            if (inputs.Busy)
            {
                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("Inputs still busy");
                }
                return(RepeatStatus.Continuable);
            }

            chunkContext.RemoveAttribute(InputsKey);
            chunkContext.SetComplete();
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("Inputs not busy, ended: {0}", inputs.End);
            }
            return(RepeatStatus.ContinueIf(!inputs.End));
        }
Esempio n. 3
0
 /// <summary>
 /// If exit status is not continuable returns <c>true</c>, otherwise
 /// delegates to  #IsComplete(IRepeatContext).
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public virtual bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     if (result != null && !result.IsContinuable())
     {
         return(true);
     }
     return(IsComplete(context));
 }
 /// <summary>
 /// If exit status is not continuable returns <code>true</code>, otherwise
 /// delegates to  #IsComplete(IRepeatContext).
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public virtual bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     if (result != null && !result.IsContinuable())
     {
         return true;
     }
     return IsComplete(context);
 }
        /// <summary>
        /// Delegates to the Completion policy.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        protected bool IsComplete(IRepeatContext context, RepeatStatus result)
        {
            bool complete = _completionPolicy.IsComplete(context, result);

            if (complete && Logger.IsDebugEnabled)
            {
                Logger.Debug("Repeat is complete according to policy and result value.");
            }
            return(complete);
        }
Esempio n. 6
0
        private async void onRepeatStatus(object sender, RepeatStatus e)
        {
            switch (e)
            {
            case RepeatStatus.None: await mqtt?.Publish("onkyo/status/repeat", "no", retain : true); break;

            case RepeatStatus.One: await mqtt?.Publish("onkyo/status/repeat", "single", retain : true); break;

            case RepeatStatus.All: await mqtt?.Publish("onkyo/status/repeat", "repeat", retain : true); break;
            }
        }
Esempio n. 7
0
 public void Play(RepeatStatus repeat, ShuffleStatus shuffle, PlayStatus play)
 {
     if (play == PlayStatus.PLAY)
     {
         wmp.controls.play();
     }
     else if (play == PlayStatus.PAUSE)
     {
         wmp.controls.pause();
     }
 }
 /// <summary>
 ///  Convenience method to execute after interceptors on a callback result.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="value"></param>
 protected void ExecuteAfterInterceptors(IRepeatContext context, RepeatStatus value)
 {
     // Don't re-throw exceptions here: let the exception handler deal with
     // that...
     if (value != null && value.IsContinuable())
     {
         for (int i = _listeners.Length; i-- > 0;)
         {
             IRepeatListener interceptor = _listeners[i];
             interceptor.After(context, value);
         }
     }
 }
Esempio n. 9
0
 /// <summary>
 /// NONE -> ALL -> ONE -> NONE ...
 /// </summary>
 public static void SetRepeatStatus(ref RepeatStatus currentStatus, BunifuImageButton button)
 {
     if (currentStatus == RepeatStatus.NONE)//next will be ALL
     {
         currentStatus = RepeatStatus.ALL;
         button.Image  = Image.FromFile(_Environment.g_SolutionDir + "/UIDesign/Asset/button_repeatall_background.png");
     }
     else if (currentStatus == RepeatStatus.ALL)//next will be ONE
     {
         currentStatus = RepeatStatus.ONE;
         button.Image  = Image.FromFile(_Environment.g_SolutionDir + "/UIDesign/Asset/button_repeatone_background.png");
     }
     else if (currentStatus == RepeatStatus.ONE)//next will be NONE
     {
         currentStatus = RepeatStatus.NONE;
         button.Image  = Image.FromFile(_Environment.g_SolutionDir + "/UIDesign/Asset/button_repeatnone_background.png");
     }
 }
 /// <summary>
 /// True if the result is null, or a RepeatStatus indicating completion.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public override bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     return (result == null || !result.IsContinuable());
 }
 /// <summary>
 ///  Terminates if the chunk size has been reached, or the result is null.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public override bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     return base.IsComplete(context, result) ||
         ((SimpleTerminationContext)context).IsComplete(this);
 }
Esempio n. 12
0
 /// <summary>
 /// Check return value from batch operation.
 /// </summary>
 /// <param name="value"></param>
 /// <returns></returns>
 protected bool CanContinue(RepeatStatus value)
 {
     return value.IsContinuable();
 }
Esempio n. 13
0
 private void formMainFrame_Load(object sender, EventArgs e)
 {
     m_buttonRepeat = RepeatStatus.NONE;
     m_buttonPlay   = PlayStatus.PAUSE;
 }
Esempio n. 14
0
 /// <summary>
 ///  Convenience method to execute after interceptors on a callback result.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="value"></param>
 protected void ExecuteAfterInterceptors(IRepeatContext context, RepeatStatus value)
 {
     // Don't re-throw exceptions here: let the exception handler deal with
     // that...
     if (value != null && value.IsContinuable())
     {
         for (int i = _listeners.Length; i-- > 0; )
         {
             IRepeatListener interceptor = _listeners[i];
             interceptor.After(context, value);
         }
     }
 }
Esempio n. 15
0
 /// <summary>
 /// Delegates to the Completion policy.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 protected bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     bool complete = _completionPolicy.IsComplete(context, result);
     if (complete && Logger.IsDebugEnabled)
     {
         Logger.Debug("Repeat is complete according to policy and result value.");
     }
     return complete;
 }
 /// <summary>
 /// True if the result is null, or a RepeatStatus indicating completion.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public override bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     return(result == null || !result.IsContinuable());
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="callback"></param>
        /// <returns></returns>
        private RepeatStatus ExecuteInternal(RepeatCallback callback)
        {
            // Reset the termination policy if there is one...
            IRepeatContext context = Start();

            // Make sure if we are already marked complete before we start then no
            // processing takes place.
            bool running = !IsMarkedComplete(context);

            foreach (IRepeatListener interceptor in _listeners)
            {
                interceptor.Open(context);
                running = running && !IsMarkedComplete(context);
                if (!running)
                {
                    break;
                }
            }

            // Return value, default is to allow continued processing.
            RepeatStatus result = RepeatStatus.Continuable;

            IRepeatInternalState state = CreateInternalState(context);
            // This is the list of exceptions thrown by all active callbacks
            ICollection <System.Exception> exceptions = state.GetExceptions();
            // Keep a separate list of exceptions we handled that need to be
            // rethrown
            ICollection <System.Exception> deferred = new List <System.Exception>();

            try
            {
                while (running)
                {
                    #region WhileRunning

                    /*
                     * Run the before interceptors here, not in the task executor so
                     * that they all happen in the same thread - it's easier for
                     * tracking batch status, amongst other things.
                     */
                    foreach (IRepeatListener interceptor in _listeners)
                    {
                        interceptor.Before(context);
                        // Allow before interceptors to veto the batch by setting
                        // flag.
                        running = running && !IsMarkedComplete(context);
                    }

                    // Check that we are still running (should always be true) ...
                    if (running)
                    {
                        #region Running
                        try
                        {
                            result = GetNextResult(context, callback, state);
                            ExecuteAfterInterceptors(context, result);
                        }
                        catch (System.Exception exception)
                        {
                            DoHandle(exception, context, deferred);
                        }

                        // N.B. the order may be important here:
                        if (IsComplete(context, result) || IsMarkedComplete(context) || deferred.Any())
                        {
                            running = false;
                        }
                        #endregion
                    }
                    #endregion
                }

                result = result.And(WaitForResults(state));
                foreach (System.Exception exception in exceptions)
                {
                    DoHandle(exception, context, deferred);
                }

                // Explicitly drop any references to internal state...
                // useless ?
                state = null;
            }

            /*
             * No need for explicit catch here - if the business processing threw an
             * exception it was already handled by the helper methods. An exception
             * here is necessarily fatal.
             */
            finally
            {
                #region HandleFinally
                HandleFinally(deferred, _listeners, context);
                #endregion
            }
            return(result);
        }
 /// <summary>
 ///  Terminates if the chunk size has been reached, or the result is null.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="result"></param>
 /// <returns></returns>
 public override bool IsComplete(IRepeatContext context, RepeatStatus result)
 {
     return(base.IsComplete(context, result) ||
            ((SimpleTerminationContext)context).IsComplete(this));
 }
 /// <summary>
 /// Check return value from batch operation.
 /// </summary>
 /// <param name="value"></param>
 /// <returns></returns>
 protected bool CanContinue(RepeatStatus value)
 {
     return(value.IsContinuable());
 }