【问题标题】:C# Windows Service EventsC# Windows 服务事件
【发布时间】:2017-05-31 11:12:30
【问题描述】:

所以我只是在这里乱搞,没有生产,只是用我的第一个 Windows 服务进行概念验证。

我正在尝试创建一个作为信号器连接侦听器的 Windows 服务。本质上,我将拥有一个 Windows 应用程序和一个 Windows 服务。 win 服务将处理与信号器集线器的连接,并在信号器调用上触发一个事件。 Windows 应用程序将侦听这些事件并根据它们执行操作。

目前我无法让它工作。我以前从未使用过事件或 Windows 服务。在我的 Windows 应用程序中,我的事件从未达到断点,而且我从

记录了一个空引用异常错误

ConnectToHub()

好吧,如果我注释掉 OnConnected() 方法调用,我会记录到集线器的成功连接。我以前从未处理过事件,所以我对事件的错误是什么?

我争论说这种方法有点矫枉过正。然而,对我来说,这是一个概念证明,我可以找到一个长期运行的 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();
    }

【问题讨论】:

  • “目前我无法让它工作” - 有什么症状?哪个部分不起作用?
  • 这就是我在调试它时遇到的问题。我必须编译服务,将其移动到另一个文件夹,安装服务并运行我的应用程序。
  • @ChrisShain 阅读我对无效部分的新增内容。
  • 好的,这有帮助。请参阅下面的回复编辑。

标签: c# windows events signalr


【解决方案1】:

您的问题有点宽泛-您没有准确描述什么不起作用,所以我猜当您启动服务时,它会说“正在启动...”很长一段时间,最终是 Windows 服务管理器给你一个错误,说你的服务没有及时启动。问题是OnStart() 预计会返回——你不能用Wait() 调用阻塞那里的线程。我的建议是在这里生成一个新的后台线程来执行等待,然后退出。这应该会让你越过第一个障碍。

另外...您可以将常规 main 方法添加到 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);

}

【讨论】:

  • 是的,我认为可能是这样的原因,但我对整个事件系统仍然有些困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多