【发布时间】: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