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); }