none
Error: does not match delegate RRS feed

  • Pregunta

  • Amigos,

    Tengo la siguiente situación.
    Necesito generar un Timer para llamar a una función llamada Conn.BeginEnquireLinkReq()
    Lo que sucede es que donde dice "aquí es donde me da el error" tengo este error de compilación.
    transvox.cs(134,55): error CS0123: Method `void TransceiverApp.Transceiver.EnquireLinkRes()' does not match delegate `void Devshock.Protocol.Smpp.SmppCallback(Devshock.Protocol.Smpp.SmppDataUnit)

    pego el trozo de codigo:

    Code Snippet

    class Prueba

    {

       static void Main(string[] args)
       {
           // Genera un timer para el EnquireLink
           System.Timers.Timer ELinkTimer = new System.Timers.Timer();
           ELinkTimer.Elapsed += new ElapsedEventHandler(OnEnquireLinkEvent);
           ELinkTimer.Interval = 15000;
           ELinkTimer.Elapsed = true;

           GC.KeepAlive(ELinkTimer);
       }


       //El evento que es llamado cuando el timer seteado alcanza

       //la unidad de tiempo especificada.

       private static void OnEnquireLinkEvent(object source, ElapsedEventArgs e)

       {
           Console.WriteLine("Entro en OnEnquireLinkEvent");
           //Se envia el Enquire LInk a la SMSMC         

           // AQUI ES DONDE ME DA EL ERROR!!!

           Conn.BeginEnquireLinkReq(new SmppEnquireLinkReq(), new SmppCallback(EnquireLinkRes), null);
       }
             
       //La SMSC responde el enquire link 
       static void EnquireLinkRes()
       {
           Console.WriteLine("Entro en EnquireLinkRes");
           Console.WriteLine("ENQUIRE LINK OK");
       }
    }


    Leí en un lado que esto se puede solucionar con Delegate algo así como:

    Code Snippet
    delegate void MyDelegate();

    Prueba Pruebaobj = new Prueba()...
    ...

    Sé que no es muy legible mi definición pero...

    Alguna ayuda?



    martes, 29 de enero de 2008 1:34

Todas las respuestas

  • ¿La variable conn de que tipo es?

     

    Sobra también la línea:

     

    Code Snippet

    ELinkTimer.Elapsed = true;

     

    Salud y suerte!

    martes, 29 de enero de 2008 7:59
  • Si tienes Razón, ahi tenía que ser
    Code Snippet

    ELinkTimer.Enable = true;



    Y la variable conn se define como variable de clase así:

    Code Snippet

    using Devshock.Protocol.Smpp;


    class cualquiera

    {

        internal static SmppConnection Conn = new SmppConnection();

    /*... */

    }




    Utilizo un librería para conexión SMPP que lo obtuve de www.devshock.com. La librería se llama Devshock.Stream.dll
    martes, 29 de enero de 2008 11:00
  • Uff!!! Entiendo... el problema es que no he trabajado nunca con esa librería, de hecho ni la conocía...

     

     

    Has probado en los foros del fabricante?

    http://www.devshock.com/forum/forum.asp?FORUM_ID=4

     

    Salud y suerte!

    martes, 29 de enero de 2008 11:29
  • Si, es más trabajo con el creador de la librería ya que él nos brinda soporte pero ahora está de vacaciones, jejeje...

    Pero sabes... te comento la experiencia que tuve...
    Merodeando por la web encontré una posible solución que me decía que tenía que utilizar un delegado en la que se declaraba una función delegado y despues se cargaba el método EnquireLinkRes() al  delegado.
    En un tiempo atrás me funcionó sin problemas lo que hice, pero como tenía otros tantos errores más importantes entonces no hice mucho caso a esa solución.
    Un día después mi navegador cuelga y se cierra abruptamente perdiendo el URL y como dejé comentado entre // esas tres lineas en un momento posterior lo borré limpiando mi codigo fuente de tantos intentos de prueba y entre ellos borré esa solución.
    Lo que sí que la solución lo quité de la documentación de la librería MSDN pero no estoy dando con ella.

    Por eso decía que su solución tiene que ver con el delegado, porque creo que actúa como puente o intermedio entre un método y una llamada.
    martes, 29 de enero de 2008 11:42
  • A ver... así tirando a ciegas, y guiándome solo por mi atrofiado instinto, me da que cuando haces:

     

        

    Code Snippet
      Conn.BeginEnquireLinkReq(new SmppEnquireLinkReq(), new SmppCallback(EnquireLinkRes), null); 

     

     


    La función que enlazas, en este caso:
             

    Code Snippet
       static void EnquireLinkRes()

     

     

     

    Debería incluir algún parámetro en la definición.

     

    Puedes comprobar la documentación?

    martes, 29 de enero de 2008 11:53
  • Sabes... ahora probando y probando...
    del código base (codigo inicial necesario para poder hacer conexion SMPP) que me dejó el fabricante obtuve esto en el metodo Main():

    Code Snippet

    Conn.OnEnquireLinkReq += new SmppCallback(Conn_OnEnquireLinkReq);



    entonces fijate que esta comentado la linea que me daba error y cambiada por la de abajo no me da mas error de compilación.

    Code Snippet

            //El evento que es llamado cuando el timer seteado alcanza la unidad de tiempo especificada.
            private static void OnEnquireLinkEvent(object source, ElapsedEventArgs e)
            {
                Console.WriteLine("Entro en OnEnquireLinkEvent");
                //Se envia el Enquire LInk a la SMSMC       
    //            Conn.BeginEnquireLinkReq(new SmppEnquireLinkReq(), new SmppCallback(EnquireLinkRes), null);
                Conn.BeginEnquireLinkReq(new SmppEnquireLinkReq(), new SmppCallback(Conn_OnEnquireLinkReq), null);
            }

            //La SMSC responde el enquire link
            static void EnquireLinkRes()
            {
                Console.WriteLine("Entro en EnquireLinkRes");
                Console.WriteLine("ENQUIRE LINK OK");
            }



    Ahora bien el problema que tengo aquí es que no puedo saber si mi aplicación está haciendo EnquireLink que sería como hacerle un ping a mi SMSC para que él sepa que yo estoy conectado a él y no me desconecte.
    No sé nomás si es el dato requerido por el método.

    Y dime otra cuestión...

    Sabes que tengo esto:

    Code Snippet

    class Transceiver

    {

      static void rcvMsg()

      {

        ...

              mdlDatos.dbInsert(origen, destino, Transceiver.iface, Text);

        ...

      }

    }

    public class mdlDatos
    {
              public static void dbInsert(string origen, string destino, string iface, string contenido)
            {
               ...
            }
    }


    y necesito hacer que esa llamada al método sea en un thread para que pueda continuar la ejecución del código.

    Y guiándome por la doc de MSDN hice esto:
    Code Snippet

    static void rcvMsg()

    {

             ...

                ThreadStart threadInsMsg = new ThreadStart(mdlDatos.dbInsert(origen, destino, Transceiver.iface, Text));
                Thread insertaMsg = new Thread(threadInsMsg);
                insertaMsg.Start();

             ...

    }



    public class mdlDatos
    {
              public static void dbInsert(string origen, string destino, string iface, string contenido)
            {
               ...
            }

    }


    Pero obtengo este error:

    transvox.cs(205,35): error CS0122: `TransceiverApp.mdlDatos.dbInsert(string, string, string, string)' is inaccessible due to its protection level


    De esta pagina obtengo información pero fíjate que mi método es public
    http://msdn2.microsoft.com/en-us/library/ha94aebs(VS.71).aspx
    martes, 29 de enero de 2008 12:37