【发布时间】: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 阅读我对无效部分的新增内容。
-
好的,这有帮助。请参阅下面的回复编辑。