【问题标题】:C# - Define scope for an Event HandlerC# - 定义事件处理程序的范围
【发布时间】:2011-07-05 21:51:19
【问题描述】:

我正在重写我的最后一个问题,只是因为我试图从不同的角度解决这个问题..

问题是这样的。我有一个用 C# 编写的类,有两个公共方法和一个在任何方法完成时触发的事件处理程序。

我创建了这个类来适应表单中的代码。

现在,如果我从一个用 VB.Net 编写的 Windows Process 项目中引用这个类,并且我调用了这两个方法中的任何一个,EventHandler 将不会触发

这个问题会不会与 EventHandler 的作用域或类似的东西有关?

如有需要,我可以贴代码

谢谢

++++++++++++++++++++++++++ 更新 ++++++++++++++++++++++++++++

好的.. 这是代码。最初我是从一个类中调用方法,但我修改了整个项目只是为了看看问题是否与试图从类中引发事件有关......所以我让这个 c# webserver 在端口 8080 上监听,然后http请求根据URL参数调用ENROLL或IDENTIFY。

只是为了澄清一点。这是一个将在连接了 USB 指纹扫描仪的计算机上运行的网络服务器。然后,Web 应用程序将向该计算机发出一个 http 请求,以执行 IDENTIFICATION 或 ENROLLMENT,这些操作在 Web 服务器中编程,操作包含在我通过 SDK 获得的扫描仪驱动程序中的方法。

有一个随驱动程序 SDK 一起提供的 C# 演示项目,这是一个简单的表单,带有从 CLICK 事件调用 ENROLL 或 IDENTIFY 方法的按钮。 CLICK 事件完成后(其中执行 ENROLL 或 IDENTIFY 方法)然后触发 Event 并执行 EventHandler。

所以现在我在同一个项目中拥有所有代码,但它的行为方式仍然相同......它进入了从 WisSensorNLibLib 类执行 StartEnroll 方法的 ENROLL 方法,但事件未被触发也未被捕获通过类的自定义事件处理程序...

也许我放错了定义或实例化...我不知道。但是事件没有触发...

所以这里是代码......(下面我将粘贴原始的Demo程序代码,所以也许通过比较有人可以找出问题所在)


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

    }
}

原始Demo程序代码:


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

【问题讨论】:

  • 不看代码很难判断。你能展示一下 C# 代码吗?
  • 发送一些代码,否则我们只能猜测......
  • 为什么要有事件处理程序?你能不能使用在两个公共方法结束时调用的另一种方法。
  • @Ash 如您所见,事件处理程序是一个自定义处理程序,它实际上属于我从项目中引用的类。我试图按照你说的方式解决它,但我发现了一个问题......一旦执行 ENROLL,我可以使用第一个参数调用 WisObj_DataEvent(它告诉它执行了哪种类型的事件,ENROLL 或 IDENTIFY),但我没有扫描结果的 STRING - 它是一个 500 个字符的字符串,由扫描的数据创建 - )...我猜该信息对班级来说是私有的...

标签: c# .net programming-languages


【解决方案1】:

首先,引发的是事件,而不是事件处理程序。
事件处理程序是一个订阅给定事件的方法

其次,作用域仅在编译时控制成员可见性,不影响事件订阅。 如果事件可见,则有效。

根据您发布的内容,人们可能只能得出以下结论:

  1. 您可能未在 VB .NET 代码中订阅事件或可能处理不正确;
  2. 从 VB .NET 代码调用时,这些方法的行为可能不同(传递的参数不同?抛出异常?)并且可能不会引发事件。

到目前为止,在我看到代码之前,我只能说这些。
你能把它精简到最简单的可重现情况吗?

【讨论】:

  • 我试图详细说明我在做什么,但它被管理员删除(太长),我无法用 500 个字符解释它......所以我不知道如何显示你……我可以把项目的 rar 文件发给你看吗?
  • @jprealini - 您不能在评论框中发布那么多代码 - 相反,您需要将其添加到您的原始问题中。点击问题底部的edit链接,就在标签列表的下方,你应该可以添加你的代码(假设它少于30,000个字符)
  • 发布整个项目毫无意义,我怀疑有人有时间深入研究它。只需创建一个包含一个类的空项目,然后尝试用尽可能小的代码重现问题。
  • @gaearon 我在原始问题中添加了一些代码和解释,以便您查看...我刚刚看到您的最后一条评论...我发布的代码实际上是整个项目。您要求我做的是我对 Demo 项目所做的事情,它可以工作,但是没有从我的项目中捕获该事件(可能是因为它是从 HTTP 请求中调用的?)... @Justin 感谢提示...我是新来的,还不知道如何正确地做事,但我学得很快... ;)
  • 我可能错了,但你的应用程序不是在Main 结束时就死了吗?您无需等待线程加入或完成。你为什么要创建另一个线程呢?尝试在应用程序中保留一个线程并缩小问题范围。
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多