C # - определить область для обработчика событий - PullRequest
0 голосов
/ 28 февраля 2011

Я переписываю свой последний вопрос только потому, что пытаюсь атаковать проблему с разных сторон.

Проблема в следующем.У меня есть класс, написанный на C #, с двумя открытыми методами и обработчиком событий, который запускается каждый раз, когда завершается любой из методов.

Я создал этот класс, адаптируя код из формы.

ТеперьЕсли я ссылаюсь на этот класс из проекта Windows Process, написанного на VB.Net, и вызываю любой из двух методов, EventHandler НЕ будет запускать

Может ли эта проблема быть связана с областью действия EventHandler или чем-то подобным?

При необходимости могу выложить код

Спасибо

++++++++++++++++++++++++ОБНОВЛЕНИЕ ++++++++++++++++++++++++

Хорошо .. вот код.Первоначально я вызывал методы из класса, но я изменил весь проект, просто чтобы посмотреть, не связана ли проблема с попыткой вызвать событие из класса ... Итак, у меня есть веб-сервер c #, прослушивающий порт 8080, и послеhttp-запрос вызывает ENROLL или IDENTIFY в соответствии с параметрами URL.

Просто для пояснения.Это веб-сервер, который будет работать на компьютере, к которому подключен USB-сканер отпечатков пальцев.Затем веб-приложение выполнит http-запрос к этому компьютеру, чтобы выполнить IDENTIFICATION или ENROLLMENT, действия, которые запрограммированы внутри веб-сервера, манипулируя методами, включенными в драйвер сканера, который я получил с помощью SDK.

У вас есть демонстрационный проект C #, который поставляется с SDK драйвера, простая форма с кнопками, вызывающими методы ENROLL или IDENTIFY из события CLICK.После завершения события CLICK (внутри которого выполняются методы ENROLL или IDENTIFY), запускается событие и выполняется EventHandler.

Итак, теперь у меня есть весь код в одном проекте, но он все ещеведет себя так же ... он входит в метод ENROLL, который выполняет метод StartEnroll из класса WisSensorNLibLib, но событие не инициируется и не перехватывается пользовательским обработчиком событий класса ...

Может быть, янеуместные определения или экземпляры ... я не знаю.Но событие не инициируется ...

Итак, вот код ... (и ниже я вставлю исходный код демонстрационной программы, так что, возможно, для сравнения кто-то сможет выяснить, в чем может быть проблема)


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

    }
}

Оригинальный код демонстрационной программы:


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

1 Ответ

1 голос
/ 28 февраля 2011

Во-первых, это событие , а не обработчик события, которое вызывается.
Обработчик событий - это метод , который подписывает на данное событие.

Во-вторых, область действия управляет видимостью элементов только во время компиляции и не влияет на подписки на события. Если событие видно, оно работает.

Из того, что вы опубликовали, можно только сделать вывод, что:

  1. Вы не можете подписаться на событие в коде VB .NET или можете обрабатывать его неправильно;
  2. При вызове из кода VB .NET эти методы могут работать по-разному (передаются разные параметры? Выбрасываются исключения) и могут не вызывать событие.

Пока это все, что я могу сказать, пока не увижу код.
Можете ли вы обрезать его до простейшего воспроизводимого случая?

...