C# Windows服务中未触发设备事件
我已经创建了一个Windows服务,该服务将与打孔机交互。该服务将与打孔机连接并获取数据(如注册用户、考勤日志等)这些方法可以很好地工作。当用户点击机器时会触发一个事件。所以我需要在服务中注册并创建一个事件处理程序。但在我的服务中它不会开火。我创建了一个示例Windows窗体应用程序,并编写了所有相同的过程。事件将在表单应用程序中触发。我的问题是 与Windows窗体应用程序相比,注册和创建Windows服务的事件处理程序有什么不同吗? 请帮帮我C# Windows服务中未触发设备事件,c#,.net,events,windows-services,C#,.net,Events,Windows Services,我已经创建了一个Windows服务,该服务将与打孔机交互。该服务将与打孔机连接并获取数据(如注册用户、考勤日志等)这些方法可以很好地工作。当用户点击机器时会触发一个事件。所以我需要在服务中注册并创建一个事件处理程序。但在我的服务中它不会开火。我创建了一个示例Windows窗体应用程序,并编写了所有相同的过程。事件将在表单应用程序中触发。我的问题是 与Windows窗体应用程序相比,注册和创建Windows服务的事件处理程序有什么不同吗? 请帮帮我 AxLxInterface.SocketIni
AxLxInterface.SocketInitialize();
AxLxInterface.WorkIndex = 0;
AxLxInterface.CardEvent += AxLxInterface_CardEvent; //event registration(but won't fire
AxLxInterface.SocketConnect(serverIp, serverPort); //will connect successfully
AxLxInterface.DateTimeRead(); //will give the machine date time
AxLxInterface.PollingStart(000, 000);
事件处理程序
public void AxLxInterface_CardEvent(object sender, _DLxInterfaceEvents_CardEventEvent e)
{
}
我怀疑您正在通过旧的帮助程序ActiveX控件与设备进行交互。大多数ActiveX控件设计用于具有功能性消息循环的STA线程,并且还需要线程关联。这是WinForms主机应用程序提供的功能 但是,这不是Windows服务的默认执行环境。因此,您需要自己创建并运行STA线程。此问题/答案可能会进一步帮助您:
服务中的事件也不例外;但是,您需要特别注意任何可能的异常和阻塞功能,因为这些可能会迫使您的服务停止或阻止它响应任何内容
我发现其中一种似乎很有效的方法是在
OnStart
方法中启动一个线程,等待事件处理程序发出Interrupt()
或Monitor.Pulse()
。然后,您的事件处理程序只需收集执行任务所需的信息并将其放入信号量中。您是否尝试过调试它,以查看它在触发事件时正在执行什么操作?当用户点击机器时,它将触发,并提供日志详细信息。可能发生的情况是您的服务正在执行阻塞应处于空闲状态时的操作。在您的服务中,代码是从哪里获取的?PollingStart
做什么?我有同样的代码,可以在windows窗体应用程序中使用。