我正在研究SignalR For Winforms官方示例。他们处理UI交互的方式是使用Program
实例/引用,如下面的代码所示:
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
//here they used Program....
Program.MainForm.WriteToConsole("Client connected: " + Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Program.MainForm.WriteToConsole("Client disconnected: " + Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
我的问题是,我在Visual Studio中创建了一个空的解决方案,我添加了2个项目,一个是WinForms项目,另一个是类库。
显然我不能在类库项目中的Program
类中给出WinForms项目的MyHub
引用,因为据我所知Hub
或{{1} } class不应该被实例化......它只是为了反射而存在。
有没有办法可以静态地将对winforms的引用传递给MyHub
类?
答案 0 :(得分:0)
好的,我刚刚通过添加一个静态字段(由Form
实现的接口来解决:
public class MyHub : Hub
{
public static ICommunicationOwner Owner;
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
Owner.GetData("Client connected: ", Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool graceFull)
{
Owner.GetData("Client disconnected: ", Context.ConnectionId);
return base.OnDisconnected(graceFull);
}
}
在服务器类中,我确实喜欢这样:
public void StartServer()
{
MyHub.Owner = _owner;
try
{
SignalR = WebApp.Start(_serverUri);
}
catch (TargetInvocationException e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
catch (Exception e)
{
_isServerStarted = false;
_owner.GetData("Connection", "Error starting server: " + e.Message);
return;
}
_owner.GetData("Connection", "Successful");
_isServerStarted = true;
}
答案 1 :(得分:0)
或者我强烈推荐使用SignalR Self-Host。这个机制对你很有帮助。这是一步一步的教程:
这种机制的工作原理如下:您正在创建一个信号器主机,就像将数据推送到特定端口一样。这个主机可以是控制台应用程序,asp.net mvc应用程序或winform等。然后其他项目或类库将是客户端(Signalr包含' SignalR Javascript客户端'和SignalR .NET客户端&# 39) 。 Web应用程序将消息作为javascript客户端,其他应用程序(如winforms或控制台)将以.net客户端的形式接收消息。这种机制是一种真正可扩展和可扩展的机制。