private void EngineStateReportEventHandler(TELEGRAPH_ENGINE_STATE State, TelegraphEngine EngineItem) { switch (State) { case TELEGRAPH_ENGINE_STATE.ENGINE_START: m_Adapter.WriteLogLine("Telegraph engine starts working.."); break; case TELEGRAPH_ENGINE_STATE.ENGINE_DISPOSED: EngineItem.EngineStateReportEvent -= new EngineStateReport(EngineStateReportEventHandler); m_Adapter.WriteLogLine("Telegraph engine is disposed."); if (m_tEngine == EngineItem) { m_tEngine = null; } break; case TELEGRAPH_ENGINE_STATE.ENGINE_STOPED: //EngineItem.EngineStateReportEvent -= new EngineStateReport(EngineStateReportEventHandler); m_Adapter.WriteLogLine("Telegraph engine stopped."); break; case TELEGRAPH_ENGINE_STATE.ENGINE_STOPPING: m_Adapter.WriteLogLine("Requesting stopping telegraph engine..."); break; } }
protected override void OnPipelineServiceCancelled() { base.OnPipelineServiceCancelled(); OnCancelAllPendingTelegraphs(); if (null != m_tEngine) { try { m_tEngine.Dispose(); m_tEngine = null; } catch (Exception Err) { Err.ToString(); } } }
//private AutoResetEvent m_EngineCompleteSignal = null; public override System.Boolean DoService() { if (Cancelled) { //! recieve cancel request OnCancelAllPendingTelegraphs(); return(false); } if (FSM_SEND_TELEGRAPHS) { if (null == m_TelegraphList) { return(false); } if (0 == m_TelegraphList.Count) { return(false); } foreach (Telegraph tTelegraph in m_TelegraphList) { SinglePhaseTelegraph tTelegraphItem = tTelegraph as SinglePhaseTelegraph; if (null == tTelegraphItem) { //! cancel this telegraph m_TelegraphList.Remove(tTelegraph); tTelegraph.OnCancel(); continue; } } if (null == m_tEngine) { m_tEngine = m_TelegraphList[0].CreateTelegraphEngine() as SinglePhaseTelegraphEngine; m_tEngine.ParentAdapter = m_Adapter; m_tEngine.Priority = ThreadPriority.AboveNormal; m_tEngine.EngineStateReportEvent += new EngineStateReport(EngineStateReportEventHandler); m_Adapter.WriteLogLine("New telegraph engine is created."); } if (null != m_tEngine.CompleteSignal) { m_tEngine.CompleteSignal.Reset(); } m_tEngine.TryToSendTelegraphs(m_TelegraphList.ToArray()); if (null != m_tEngine.CompleteSignal) { m_tEngine.CompleteSignal.WaitOne(); } else { Thread.Sleep(10); } FSM_SEND_TELEGRAPHS = false; FSM_WAIT_RESULT = true; } if (FSM_WAIT_RESULT) { do { lock (((ICollection)m_TelegraphList).SyncRoot) { if (0 == m_TelegraphList.Count) { if (null != m_tEngine) { try { m_tEngine.Dispose(); m_tEngine = null; } catch (Exception) { } } //m_tEngine = null; FSM_WAIT_RESULT = false; FSM_SEND_TELEGRAPHS = true; return(false); } } if (Cancelled) { FSM_WAIT_RESULT = false; FSM_SEND_TELEGRAPHS = true; //! recieve cancel request OnCancelAllPendingTelegraphs(); return(false); } Thread.Sleep(1); } while (true); } return(true); }