//! \brief timer
        private void PipelineTimeoutTimer(object sender, ElapsedEventArgs e)
        {
            if (m_wPipelineTimeoutCounter > 0)
            {
                m_wPipelineTimeoutCounter--;
                if (0 == m_wPipelineTimeoutCounter)
                {
                    //! service no response for quite a long time
                    m_TimeOutTimer.Stop();

                    try
                    {
                        //! time out
                        m_PipelineCoreThread.Abort();
                    }
                    catch (Exception) { }

                    //! drop service
                    lock (((ICollection)m_ServicesQueue).SyncRoot)
                    {
                        if (m_ServicesQueue.Count > 0)
                        {
                            PipelineCoreService ServiceItem = m_ServicesQueue.Dequeue();
                            if (null != ServiceItem)
                            {
                                //! raising event
                                ServiceItem.OnServiceCancelled();
                            }
                        }
                    }

                    try
                    {
                        m_PipelineCoreThread.Join();
                    }
                    catch (Exception) { }
                    finally
                    {
                        m_PipelineCoreThread = null;
                    }
                    if (m_RequestStop)
                    {
                        m_RequestStop = false;

                        //! raising event
                        OnPipelineCoreStateReport(PIPELINE_STATE.PIPELINE_STOPPED);
                    }
                    else
                    {
                        //! restart pipeline
                        PipelineOpen = true;
                    }
                }
            }
        }
        //! \brief adding a pipeline core service
        public virtual Boolean AddService(PipelineCoreService ServiceItem)
        {
            if (!Available)
            {
                return(false);
            }

            if (null == ServiceItem)
            {
                return(false);
            }

            lock (((ICollection)m_ServicesQueue).SyncRoot)
            {
                try
                {
                    //! add service to queue
                    m_ServicesQueue.Enqueue(ServiceItem);
                    m_WaitService.Set();
                }
                catch (System.Exception)
                {
                    //System.Console.WriteLine(e.ToString());
                    return(false);
                }
            }


            if (AutoStart)
            {
                //! auto start pipeline
                PipelineOpen = true;
            }

            return(true);
        }
 //! \brief method for add a pipeline service
 public override System.Boolean AddService(PipelineCoreService ServiceItem)
 {
     return(AddService(ServiceItem as PipelineService));
 }
 private void PipelineServiceCancelledEvent(PipelineCoreService Item)
 {
     Item.PipelineServiceCancelledEvent -= new PipelineCoreService.PipelineServiceCancelled(PipelineServiceCancelledEvent);
     //! set flag
     m_StageServiceCancelled = true;
 }
        //! \brief pipeline background task
        private void PipelLineCoreBackgroundTask()
        {
            if (null == m_PipelineCoreThread)
            {
                return;
            }
            Boolean tWaitService = false;

            //LogWriter.Write("V");
            do
            {
                PipelineCoreService ServiceItem = null;

                if (tWaitService)
                {
                    m_WaitService.WaitOne();
                    tWaitService = false;
                }

                //! get queue item
                lock (((ICollection)m_ServicesQueue).SyncRoot)
                {
                    if (0 == m_ServicesQueue.Count)
                    {
                        if (AutoStart)
                        {
                            break;
                        }
                        else
                        {
                            tWaitService = true;
                            //Thread.Sleep(20);
                            continue;
                        }
                    }

                    //! get a new service item
                    ServiceItem = m_ServicesQueue.Peek();
                    if (null == ServiceItem)
                    {
                        m_ServicesQueue.Dequeue();
                        continue;
                    }
                    if (!ServiceItem.Available)
                    {
                        m_ServicesQueue.Dequeue();
                        continue;
                    }

                    //! raising event
                    ServiceItem.OnLine();
                }


                if (ServiceItem.Timeout > 0)
                {
                    m_wPipelineTimeoutCounter = ServiceItem.Timeout;
                    m_TimeOutTimer.Start();

                    do
                    {
                        if (!ServiceItem.DoService())
                        {
                            try
                            {
                                m_TimeOutTimer.Stop();
                                m_wPipelineTimeoutCounter = ServiceItem.Timeout;

                                if (ServiceItem.Cancelled)
                                {
                                    //! raising event
                                    ServiceItem.OnServiceCancelled();
                                }
                                else
                                {
                                    //! raising event
                                    ServiceItem.OnServiceComplete();
                                }
                                break;
                            }
                            catch (Exception)
                            {
                                break;
                            }
                        }

                        //! after stop request flag set to true, you have only m_wPipelineTimeout * 100ms to die...
                        if ((!m_RequestStop) && (!ServiceItem.Cancelled))
                        {
                            m_wPipelineTimeoutCounter = ServiceItem.Timeout;
                        }

                        //Thread.Sleep(1);
                    }while (true);

                    lock (((ICollection)m_ServicesQueue).SyncRoot)
                    {
                        try
                        {
                            m_ServicesQueue.Dequeue();
                        }
                        catch (Exception) { }
                    }
                }
                else
                {
                    do
                    {
                        if (!ServiceItem.DoService())
                        {
                            //! raising event
                            if (ServiceItem.Cancelled)
                            {
                                //! raising event
                                ServiceItem.OnServiceCancelled();
                            }
                            else
                            {
                                //! raising event
                                ServiceItem.OnServiceComplete();
                            }
                            break;
                        }

                        if ((m_RequestStop) || (ServiceItem.Cancelled))
                        {
                            //! after stop request flag set to true, it's your last chance...
                            ServiceItem.DoService();

                            //! raising event
                            ServiceItem.OnServiceCancelled();
                            break;
                        }
                    }while (true);

                    lock (((ICollection)m_ServicesQueue).SyncRoot)
                    {
                        if (m_ServicesQueue.Count > 0)
                        {
                            m_ServicesQueue.Dequeue();
                        }
                    }
                }

                m_wPipelineTimeoutCounter = 0;

                if (m_RequestStop)
                {
                    m_RequestStop = false;
                    break;
                }
            }while (true);

            //! raising event
            OnPipelineCoreStateReport(PIPELINE_STATE.PIPELINE_STOPPED);

            m_PipelineCoreThread = null;
        }