| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using Aitex.Core.RT.Log;namespace MECF.Framework.Common.Communications{    public enum EnumHandlerState    {        Create,        Sent,        Acked,        Completed,    }    public abstract class HandlerBase    {        public bool IsComplete        {            get { return _state == EnumHandlerState.Completed; }        }        public bool IsAcked        {            get { return _state == EnumHandlerState.Acked; }        }        private EnumHandlerState _state;        public string Name { get; set; }        public TimeSpan AckTimeout { get; set; }        public TimeSpan CompleteTimeout { get; set; }        public MessageBase ResponseMessage { get; set; }        public string SendText { get; set; }        public byte[] SendBinary { get; set; }        protected Stopwatch _timerAck = new Stopwatch();        protected Stopwatch _timerComplete = new Stopwatch();        protected HandlerBase(string text)        {            SendText = text;            SendBinary = null;            AckTimeout = TimeSpan.FromSeconds(10);            CompleteTimeout = TimeSpan.FromSeconds(300);            _state = EnumHandlerState.Create;        }        protected HandlerBase(byte[] buffer)        {            SendText = "";            SendBinary = buffer;            AckTimeout = TimeSpan.FromSeconds(10);            CompleteTimeout = TimeSpan.FromSeconds(300);            _state = EnumHandlerState.Create;        }        public abstract bool HandleMessage(MessageBase msg, out bool transactionComplete);        public void SetState(EnumHandlerState state)        {            _state = state;            if (_state == EnumHandlerState.Sent) //connection's responsibility            {                _timerAck.Restart();                _timerComplete.Restart();            }            if (_state == EnumHandlerState.Acked)  //handler's responsibility            {                _timerAck.Stop();            }            if (_state == EnumHandlerState.Completed)//handler's responsibility            {                _timerAck.Stop();                _timerComplete.Stop();            }        }        public bool CheckTimeout( )        {            if (_state == EnumHandlerState.Sent && _timerAck.IsRunning && _timerAck.Elapsed > AckTimeout)            {                _timerAck.Stop();                _state = EnumHandlerState.Completed;                return true;            }            if ((_state == EnumHandlerState.Sent || _state==EnumHandlerState.Acked) && _timerComplete.IsRunning && _timerComplete.Elapsed > CompleteTimeout)            {                _timerAck.Stop();                _timerComplete.Stop();                _state = EnumHandlerState.Completed;                return true;            }            return false;        }    }}
 |