コード例 #1
0
        /// <summary>
        /// Función para el envío de datos, antes de enviar comprueba que no se esté esperando una petición.
        /// Normalmente es un timer quien lanza esta función, pero también se podría lanzar manualmente.
        /// </summary>
        /// <param name="sender">Objeto que llama a la función (se puede pasar como valor null o this)</param>
        /// <param name="e">Arguemntos (no se tratan)</param>
        private void Envio(object sender, EventArgs e)
        {
            try
            {
                //Se detiene el timer para que no se llame al evento hasta que no se haya procesado
                tm_envio.Stop();

                ///Gestiona un protocolo de parada y espera. Hasta que no se ha recivido una respuesta
                ///no procesa la siguiente. Ojo! no tiene en cuenta posibles fallos de comunicación.
                ///(no utiliza un timeout).
                ///Tras 300 intentos se pasa a la siguiente trama.
                reenvio++;
                if (reenvio < 300 && listaPeticiones.Count > 0 && listaPeticiones.ElementAt(count % listaPeticiones.Count).Value.WaitResponse == false)
                {
                    count++;
                    StatePeticion peticionActual = listaPeticiones.ElementAt(count % listaPeticiones.Count).Value;
                    byte[]        trama          = peticionActual.Request;

                    //Se envía el mensaje a traves el conector.
                    conector.Enviar(trama);
                    peticionActual.Set();

                    //Inicia la recepción de datos en el conector por si no estba listo para recibir.
                    conector.StartReceive();
                }
                //Tras 300 intentos se considera que la trama no se ha contestado o no ser ha recibido por parte del servidor
                else if (reenvio > 300)
                {
                    listaPeticiones.ElementAt(count % listaPeticiones.Count).Value.Reset();
                    reenvio = 0;
                    count++;
                }
                //Se reanuda el timer.
                tm_envio.Start();
            }
            catch (Exception ex)
            {
                //MessageBox.Show("Error..... " + ex.Message);
            }
            finally
            {
                tm_envio.Start();
            }
        }
コード例 #2
0
 /// <summary>
 /// Añade una petición a nuestra lista de peticiones.
 /// </summary>
 /// <param name="peticion"></param>
 public void Add(StatePeticion peticion)
 {
     //Se añade la petición a la lista StatePetción(trama,  modelo de datos, función que procesará los datos recibidos,
     //servidor de protocolo al que pertenece la trama)
     listaPeticiones.Add(peticion.Request, peticion);
 }