C#Windows服务事件

所以我只是在这里搞乱了我的第一个Windows服务的概念certificate。

我试图本质上创build一个窗口服务,作为信号连接的监听器。 实质上,我将有一个Windows应用程序和一个Windows服务。 胜利服务将处理连接到信号中心和信号员电话发射事件。 Windows应用程序将侦听这些事件并根据它们执行操作。

目前我无法得到这个工作。 我从来没有使用事件,或以前的Windows服务。 在我的Windows应用程序,我的事件从来没有打到他们的断点,以及我从日志logging空引用exception的错误

ConnectToHub()

好的,如果我注释掉OnConnected()方法调用我logging一个成功的连接到集线器。 我从来没有和事件合作过,所以我的错误与事件?

我辩论这种方法有点矫枉过正。 然而,对我来说,这是一个概念certificate,我可以find长期运行的Windows服务的用途,并添加一些事件的混合。

服务代码:

public delegate void MessageRecievedEventHanlder(object sender, MessageRecievedArgs e); public delegate void ConnectedToHubEventHandler(object sender, ConnectedArgs e); public partial class SignalRService : ServiceBase { IHubProxy _hub; HubConnection connection; string url = @"http://localhost:8080/"; private Message LastMessage; public static event MessageRecievedEventHanlder NewMessage; protected virtual void OnNewMessage(MessageRecievedArgs e) { NewMessage(null, e); } public static event ConnectedToHubEventHandler Connected; protected virtual void OnConnected(ConnectedArgs e) { System.IO.File.WriteAllText(@"C:\Users\Bailey Miller\Desktop\FTP\Logg.txt", "Hit OnConnected " + e.Success +" " + Connected != null ? "Isn't null" : "Null event"); Connected(null, e); } public SignalRService() { InitializeComponent(); } protected override void OnStart(string[] args) { ConnectToHub().Wait(); } private async Task ConnectToHub() { try { //Connecting if (connection == null) { connection = new HubConnection(url); } if (_hub == null) { _hub = connection.CreateHubProxy("ChatHub"); } await connection.Start(); //Connected //Configure all the incoming options _hub.On<Message>("RecieveMessage", IncomingMessage); System.IO.File.WriteAllText(@"C:\Users\Bailey Miller\Desktop\FTP\Succes.txt", "Connected"); OnConnected(new ConnectedArgs(true)); } catch (Exception ex) { //Failed //OnConnected(new ConnectedArgs(false)); System.IO.File.WriteAllText(@"C:\Users\Bailey Miller\Desktop\FTP\Fail.txt", "Failed to connect " + ex.Message.ToString()); } } private void IncomingMessage(Message state) { DateTime? lmt; //Determine if has lastmessagetime if (LastMessage == null) { lmt = null; } else { lmt = LastMessage.RecievedAt; } LastMessage = state; //New Message //OnNewMessage(new MessageRecievedArgs(state, lmt)); } protected override void OnStop() { } } public class MessageRecievedArgs : EventArgs { public Message NewMessage { get; } public DateTime? LastMessageTime { get; } public MessageRecievedArgs(Message msg, DateTime? lmt) { this.NewMessage = msg; this.LastMessageTime = lmt; } } public class ConnectedArgs : EventArgs { public bool Success { get; } public ConnectedArgs(bool suc) { this.Success = suc; } } 

我的Windows应用程序截至目前:

 public MainWindow() { InitializeComponent(); SignalRService.SignalRService.NewMessage += SignalRService_NewMessage; SignalRService.SignalRService.Connected += SignalRService_Connected; } private void SignalRService_Connected(object sender, SignalRService.ConnectedArgs e) { throw new NotImplementedException(); } private void SignalRService_NewMessage(object sender, SignalRService.MessageRecievedArgs e) { throw new NotImplementedException(); } 

你的问题有点宽泛 – 你没有描述到底什么是不工作,所以我猜测,当你开始你的服务,它说“开始……”很长一段时间,最终Windows服务管理器给你一个错误,说你的服务没有及时启动。 问题是, OnStart()预计将返回 – 你不能用Wait()调用阻塞那里的线程。 我的建议是在这里产生一个新的后台线程来执行等待,然后退出。 那应该会让你经历第一个障碍。

作为另一个旁边…您可以将一个常规的主要方法添加到Windows服务项目,将项目类型更改为控制台应用程序,并以这种方式运行,以减少调试周期时间。 然后,当你确定它基本上工作,将项目类型改回到Windows服务并安装它。

编辑:现在你有一个更好的错误描述,我看到了真正的问题。 问题在于,你正在提出一个事件,而不首先检查null。 在附加侦听器之前,事件字段为空。 所以改变你的代码如下:

 protected virtual void OnConnected(ConnectedArgs e) { System.IO.File.WriteAllText(@"C:\Users\Bailey Miller\Desktop\FTP\Logg.txt", "Hit OnConnected " + e.Success +" " + Connected != null ? "Isn't null" : "Null event"); ConnectedToHubEventHandler connectedEvent = Connected; if (connectedEvent != null) // This event might be null, so check first connectedEvent(null, e); }