2011-02-28 2 views
0

Je réécris ma dernière question, juste parce que je suis en train d'attaquer le problème de differente angles ..C# - Définir la portée pour un gestionnaire d'événements

Le problème est. J'ai une classe écrite en C#, avec deux méthodes publiques, et un eventhandler qui se déclenche chaque fois que l'une des méthodes est terminée.

J'ai créé cette classe en adaptant le code à partir d'un formulaire.

Maintenant, si je fais référence cette classe d'un projet de processus Windows écrit en VB.Net, et j'appelle l'une des deux méthodes, le gestionnaire d'événements ne se déclenche pas

ce problème pourrait être lié à la portée de EventHandler ou quoi que ce soit comme ça?

Si nécessaire, je peux envoyer le code

Merci

++++++++++++++++++++++++ MISE À JOUR +++ ++++++++++++++++++

Ok .. voici le code. A l'origine j'appelais les méthodes d'une classe, mais j'ai modifié le projet entier juste pour voir si le problème avait à faire avec essayer d'élever l'événement de la classe ... Donc j'ai ce serveur web C# écoute sur le port 8080, et La requête http appelle ENROLL ou IDENTIFY en fonction des paramètres d'URL.

Juste pour clarifier un peu. Il s'agit d'un serveur Web qui fonctionnera sur un ordinateur doté d'un lecteur d'empreintes digitales USB connecté. Ensuite, l'application web effectuera une requête http sur cet ordinateur pour exécuter une IDENTIFICATION ou INSCRIPTION, actions qui sont programmées dans le serveur web, manipulant les méthodes incluses dans le pilote du scanner que j'ai reçu avec le SDK. Dans le cas d'un projet de démonstration C# fourni avec le SDK du pilote, un simple formulaire avec des boutons appelant les méthodes ENROLL ou IDENTIFY à partir de l'événement CLICK. Une fois l'événement CLICK terminé (à l'intérieur duquel sont exécutées les méthodes ENROLL ou IDENTIFY), l'événement est déclenché et EventHandler s'exécute. Donc maintenant j'ai tout le code dans le même projet, mais il se comporte toujours de la même manière ... il va dans la méthode ENROLL qui exécute la méthode StartEnroll à partir de la classe WisSensorNLibLib, mais l'événement n'est pas déclenché capturé par le gestionnaire d'événements personnalisé de la classe ...

Peut-être que je suis en train d'égarer les définitions ou les instanciations ... Je ne sais pas. Mais l'événement ne se déclenche pas ...

Voici donc le code ... (et ci-dessous, je vais coller le code du programme de démonstration originale, peut-être par quelqu'un comparaison peut savoir ce que le problème pourrait être)


namespace WinServer 
    { 
     using System; 
     using System.IO; 
     using System.Net; 
     using System.Net.Sockets; 
     using System.Text; 
     using System.Threading;  
     using System.Collections.Generic; 
     using System.ComponentModel; 
     using System.Data;   
     using System.Data.SqlClient; 
     using System.Drawing; 
     //************************************ 
     //This is the class that belongs to the Fingerprint Scanner 
     //************************************ 
     using WisSensorNLibLib; 


    class WinServer 
    {  
     private TcpListener myListener ; 
     private int port = 8080 ; // Select any free port you wish   
     private Int16 id; 
     private string indx; 
     //************************************ 
     //Create instance of WisSensorN  
     //************************************   
     WisSensorN WisObj = new WisSensorN();   
     private String mod;   
     private Int32 Rows; 

     public WinServer() 
     { 
      try 
      { 
       myListener = new TcpListener(IPAddress.Any, port) ; 
       myListener.Start();     
       Thread th = new Thread(new ThreadStart(StartListen)); 
       th.Start() ; 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("An Exception Occurred while Listening :" +e.ToString()); 
      } 
     } 

     public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************   
     } 

     public void SendToBrowser(String sData, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************ 
     } 



     public void SendToBrowser(Byte[] bSendData, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************ 
     } 


     // Application Starts Here.. 
     public static void Main() 
     { 
      WinServer MWS = new WinServer(); 
     } 


     public void StartListen() 
     { 
     //Call ENROLL method 
     Enroll(); 
     mySocket.Close();      

     } 


     //********************************** 
     //EVENT CAPTURE 
     //********************************** 
     public void WisObj_DataEvent(WisSensorNLibLib.DATA data, string str) 
     { 

      switch (data) 
      { 
       //ENROLL 
       case DATA.DATA_ENROLL: 

        try 
        { 
         Console.WriteLine("success"); 
        } 
        catch (Exception ee) 
        { 
         Console.WriteLine(ee.Message);       
        }      
        break; 

       //IDENTIFY 
       case DATA.DATA_IDENTIFY_CAPTURE: 

        try 
        { 
         Console.WriteLine("Success"); 
        } 
        catch (Exception ee) 
        { 
         Console.WriteLine(ee.Message);      
        }      
        break; 
      } 
     } 

     //********************************** 
     //ENROLL 
     //After this method ends, WisObj_DataEvent should capture the event 
     //********************************** 

     public void Enroll() 
     { 
      try 
      { 
       WisObj.Open(); 
       WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
       WisObj.StartEnroll(); 
      } 
      catch 
      { 
       Console.WriteLine(ee.Message); 
      } 
     } 

     //********************************** 
     //IDENTIFY 
     //After this method ends, WisObj_DataEvent should capture the event 
     //********************************** 

     public void Identify() 
     { 
      try 
      { 
       WisObj.Open(); 
       WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
       WisObj.IdentifyCapture(); 
      } 
      catch 
      { 
       Console.WriteLine(ee.Message); 
      } 
     } 


     public void WisClose() 
     { 
      WisObj.Close(); 
     } 

    } 
} 

Code d'origine du programme de démonstration:


using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Text; 
    using System.Windows.Forms; 
    using WisSensorNLibLib; 

namespace OR200N_Demo 
{ 
    public partial class Form1 : Form 
    { 
     private const int MaxUser = 10; 
     WisSensorN WisObj = new WisSensorN(); 
     string[] DB = new string[MaxUser]; 
     int nEnrolled = 0; 
     string indx; 
     string msg; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      MessageBox.Show("Please make sure the scanner is plugged!!"); 
      WisObj.Open(); 
      WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
      WisObj.SetDisplay((int)FingerPic.Handle); 
     } 

     private delegate void CompleteHandler(string bir); 
     private void Complete(string str) 
     { 
      Status.Text = str; 
     } 

     private void WisObj_DataEvent(WisSensorNLibLib.DATA data, string str) 
     { 
      switch (data) 
      { 
       case DATA.DATA_ENROLL: 
        indx = nEnrolled.ToString(); 
        msg = "User #" + indx + " is enrolled successfully!!"; 
        this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        DB[nEnrolled] = string.Copy(str); 
        nEnrolled++; 
        break; 

       case DATA.DATA_IDENTIFY_CAPTURE: 
        int nMatched; 
        nMatched = WisObj.Identify(str, DB); 
        if (nMatched < 0) 
        { 
         msg = "No valid finger matched!!"; 
         this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        } 
        else 
        { 
         indx = nMatched.ToString(); 
         msg = "User #" + indx + " is matched!!"; 
         this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        } 
        break; 

       case DATA.DATA_VERIFY_CAPTURE: 
        break; 
      } 
     } 
     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      WisObj.Close(); 
     } 

     private void Enroll_Click(object sender, EventArgs e) 
     { 
      if (nEnrolled >= MaxUser) 
      { 
       MessageBox.Show("Exceed maximum enrolled number (10)!!"); 
      } 
      else 
      { 
       Status.Text = "Please put your finger on the scanner!!"; 
       WisObj.StartEnroll(); 
      } 
     } 

     private void Identify_Click(object sender, EventArgs e) 
     { 
      Status.Text = "Please put your finger on the scanner!!"; 
      WisObj.IdentifyCapture(); 
     } 
    } 
} 
+3

Il est difficile de dire sans voir le code. Pouvez-vous montrer le code C#? –

+0

envoyer du code, sinon nous pouvons juste deviner ... –

+0

Pourquoi avoir un gestionnaire d'événements? Pourriez-vous ne pas utiliser une autre méthode à la place qui est appelée à la fin des deux méthodes publiques. –

Répondre

1

Tout d'abord, il s'agit de événement, pas de gestionnaire d'événements, qui est en cours de levée.
Le gestionnaire d'événements est une méthode qui subribes à un événement donné.

Deuxièmement, la portée ne gouverne que la visibilité des membres au moment de la compilation et n'affecte pas les abonnements aux événements. Si l'événement est visible, cela fonctionne.

D'après ce que vous avez publié, on peut seulement conclure que:

  1. Vous ne pouvez pas souscrire à l'événement dans le code VB .NET ou peut gérer de manière incorrecte;
  2. Lorsqu'elles sont appelées à partir du code VB .NET, ces méthodes peuvent agir différemment (différents paramètres étant passés? Exeptions thrown?) Et ne peuvent pas déclencher l'événement.

Jusqu'ici, c'est tout ce que je peux dire jusqu'à ce que je vois le code.
Pouvez-vous réduire au cas le plus simple reproductible?

+0

Merci d'avoir répondu ... Ajout plus ci-dessous ... – jprealini

+0

J'ai essayé de détailler exactement ce que je faisais, mais il a été supprimé par admin (trop long), et je ne peux pas l'expliquer en 500 caractères ... Donc je n'ai aucune idée de comment vous montrer. .. Puis-je vous envoyer le projet dans un fichier rar afin que vous puissiez jeter un coup d'oeil? – jprealini

+1

@jprealini - Vous ne pouvez pas poster autant de code dans une boîte de commentaire - à la place, vous devez l'ajouter à votre question d'origine. Cliquez sur le lien 'edit' en bas de la question, juste sous la liste des tags, et vous devriez être capable d'ajouter votre code (en supposant qu'il soit inférieur à 30 000 caractères) – Justin

Questions connexes