protected virtual void onCommandReceived(CommandReceivedEventArgs <WSCommandTypeBase> args)
 {
     if (CommandReceived != null)
     {
         CommandReceived(this, args);
     }
 }
        public bool ProcessMessage(MessageReceivedEventArgs e, List <ICommand> commandList)
        {
            ICommandParser    cmdParser;
            WSCommandTypeBase cmd = GetRequestCommand(e, out cmdParser);

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

            bool isProcessed = false;

            if (cmd != null)
            {
                // 关于是否触发CommandReceived事件:
                //      当使用带有回调方法的SendCommand发送命令时,接收到应答命令时不会触发CommandReceived事件
                //      当使用SendCommandSync方法发送同步返回的命令时,接收到应答命令时不会触发CommandReceived事件
                //      当接收到的命令能够被内置的CommandList处理时,会触发CommandReceived事件,并且自动设置ReplyCommand为执行完后返回的命令,
                // 同时将事件参数中的IsUnknown属性设置为false。
                //      当接收到的命令不属于上述任一情况时,将触发CommandReceived事件,并将IsUnknown属性设置为true

                CommandItem <WSCommandTypeBase> ci = null;
                lock (Session.SyncLocker)
                {
                    ci = Session.Commands.OfType <CommandItem <WSCommandTypeBase> >().FirstOrDefault(x => x.CommandRequest != null && x.CommandRequest.IsPairCommand(cmd));
                }
                CommandReceivedEventArgs <WSCommandTypeBase> args = new CommandReceivedEventArgs <WSCommandTypeBase>(cmd);
                args.IsUnknwon = true;

                // 检查命令是否能被内置命令列表处理
                ICommand exeCommand          = commandList.FirstOrDefault(x => x.CanExecute(cmd));
                ICommand replyCommand        = null;
                bool     isFireReceivedEvent = true;
                if (exeCommand != null)
                {
                    try
                    {
                        replyCommand = exeCommand.Execute(cmd, new ExecuteCommandContext()
                        {
                            CommandSession = Session
                        });
                        isProcessed = true;
                    }
                    catch (Exception ex)
                    {
                        logger.Error("执行命令失败:{0} \r\n{1}", cmd.CommandName, ex.ToString());
                    }


                    args.IsUnknwon = false;
                }


                args.Session = Session;
                if (ci != null)
                {
                    ci.CommandResponse  = cmd;
                    args.RequestCommand = ci.CommandRequest;
                    lock (Session.SyncLocker)
                    {
                        if (cmd.IsOver)
                        {
                            Session.Commands.Remove(ci);
                        }
                    }
                    if (ci.ResponseCallback != null)
                    {
                        ci.ResponseCallback(ci);
                        isFireReceivedEvent = false;
                    }

                    if (ci.IsSync)
                    {
                        ci.Wait.Set();
                        isFireReceivedEvent = false;
                    }
                }

                if (isFireReceivedEvent)
                {
                    onCommandReceived(args);
                }

                SetReplyCommand(Session, replyCommand, e, cmd.RequestID, cmdParser);
            }

            return(isProcessed);
        }