/// <summary>
        /// Start new sequence in other async thread.
        /// </summary>
        /// <param name="NextSequence">New Sequence.</param>
        /// <returns>Task newly run.</returns>
        public Task StartSequence(ComPortAccessSequence NextSequence)
        {
            if (null == NextSequence)
            {
                return(null);
            }

            Task <object> task = Task <object> .Run(() =>
            {
                this.OnSequenceStartingEvent(
                    new ConnectStateChangedEventArgs(
                        new ConnectState(NextSequence.StartingConnectionState)));

                if (null != this.CurSequence)
                {
                    this.CurSequence.StopSequence();
                    this.ReleaseEventHandler(this.CurSequence);
                    this.CurSequence = null;
                }

                this.CurSequence = NextSequence;
                this.SetupEventHandler(this.CurSequence);
                Task MainTask = this.CurSequence.StartSequence(this.ComPortAcc);
                this.OnSequenceStartedEvent(
                    new ConnectStateChangedEventArgs(
                        new ConnectState(this.CurSequence.StartedConnectionState)));

                return((object)MainTask);
            });

            return((Task)(task.Result));
        }
        /// <summary>
        /// A factory method to create concrete ComPortAccessSequence object.
        /// </summary>
        /// <param name="SeqName">
        /// Identifier used int creating ComPortAccessSequence concrete object.
        /// </param>
        /// <returns>Concrete ComPortAccessSequence object.</returns>
        public static ComPortAccessSequence SequenceFactory(SequenceName SeqName)
        {
            ComPortAccessSequence AccessSequence = null;

            switch (SeqName)
            {
            case SequenceName.SEQUENCE_NAME_CONNECT:
                AccessSequence = new ComPortConnectSequence();
                break;

            case SequenceName.SEQUENCE_NAME_DISCONNECT:
                AccessSequence = new ComPortDisconnectSequence();
                break;

            case SequenceName.SEQUENCE_NAME_SEND_AND_RECV:
                AccessSequence = new EchoBackComPortSendRecvSequence();
                break;

            default:
                AccessSequence = null;
                break;
            }
            return(AccessSequence);
        }
 /// <summary>
 /// Release event handler from sequence passed by arguemnt.
 /// </summary>
 /// <param name="Sequence"></param>
 public void ReleaseEventHandler(ComPortAccessSequence Sequence)
 {
     Sequence.TaskFinishedEvent          -= this.SequenceFinisedEventCallback;
     Sequence.NotifySendReceiveDataEvent -= this.NotifySendReceiveDataEventCallback;
     Sequence.NotifyRecvExceptionEvent   -= this.NotifyRecvExceptionEventCallback;
 }