/// <summary> /// Método para adicionar uma nova mensagem na lista de envio para o cliente /// </summary> /// <param name="mensagem">Mensagem que será enviada para o Cliente</param> public void EnfileirarMensagem(MensagemDto mensagem) { if (FilaEscrita != null) { FilaEscrita.Enqueue(mensagem); } if (processarMensagensAsync != null) { processarMensagensAsync.BeginInvoke(null, null); } }
/// <summary> /// Efetuar o envio das mensagens para o respectivo cliente /// </summary> public void RnProcessarFilaEscrita() { lock (lockerProcessarEscrita) { if (executandoEnvioMensagens) { return; } executandoEnvioMensagens = true; MensagemDto mensagemTemporaria; while (TcpUtil.ConexaoTcpValida(TcpCliente) && FilaEscrita.Count > 0) { //Desenfileirar uma mensagemDto efetuando um clone da mensagem mensagemTemporaria = FilaEscrita.Dequeue(); if (mensagemTemporaria == null) { break; } mensagemTemporaria = mensagemTemporaria.Clone(); mensagemTemporaria.Dump(string.Format("Clone para processamento(ConexaoCliente-{0}|Mensagem-{1}):", LoginCliente, ConverterTipoMensagemParaString(mensagemTemporaria))); switch (mensagemTemporaria.Tipo) { case CsTipoMensagem.NovosUsuariosConectados: case CsTipoMensagem.UsuarioDesconectado: RnEnviarMensagensQuePossuemUsuarios(mensagemTemporaria); break; case CsTipoMensagem.EdicaoTarefaAutorizada: if (SeMensagemForUmaAutoNotificacao(mensagemTemporaria)) { RnEnviarMensagemAoAccessClient(mensagemTemporaria); } else if (AoReceberMensagemErrada != null) { AoReceberMensagemErrada(mensagemTemporaria); } break; case CsTipoMensagem.EdicaoTarefaRecusada: case CsTipoMensagem.ConexaoRecusadaServidor: case CsTipoMensagem.ServidorDesconectando: case CsTipoMensagem.ExclusaoTarefaPermitida: case CsTipoMensagem.EdicaoNomeCronogramaPermitida: case CsTipoMensagem.EdicaoNomeCronogramaRecusada: RnEnviarMensagemAoAccessClient(mensagemTemporaria); break; case CsTipoMensagem.NovaTarefaCriada: case CsTipoMensagem.ExclusaoTarefaFinalizada: case CsTipoMensagem.MovimentacaoPosicaoTarefa: case CsTipoMensagem.DadosCronogramaAlterados: case CsTipoMensagem.InicioEdicaoNomeCronograma: case CsTipoMensagem.InicioEdicaoTarefa: case CsTipoMensagem.EdicaoTarefaFinalizada: if (!SeMensagemForUmaAutoNotificacao(mensagemTemporaria)) { RnEnviarMensagemAoAccessClient(mensagemTemporaria); } break; } } executandoEnvioMensagens = false; } }