【问题标题】:Give a reference to another project/winform in SignalR Hub引用 SignalR Hub 中的另一个项目/winform
【发布时间】:2015-02-25 16:05:18
【问题描述】:

我正在研究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 项目,另一个是类库。

显然,我不能在类库项目中的MyHub 类中从WinForms 项目中提供Program 引用,因为据我所知,不应实例化HubMyHub 类。 .它只是为了反射而存在。

有没有一种方法可以将我的 winforms 的引用静态传递给MyHub 类?

【问题讨论】:

    标签: c# .net winforms signalr signalr-hub


    【解决方案1】:

    好的,我刚刚通过添加一个静态字段解决了(由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;
        }
    

    【讨论】:

      【解决方案2】:

      另外,我强烈建议使用 SignalR Self-Host。这种机制对您非常有帮助。这是一步一步的教程:

      Self-Host

      这种机制的工作原理是这样的:您正在创建一个信号器主机,它就像将数据推送到特定端口。该主机可以是控制台应用程序、asp.net mvc 应用程序或 winform 等。然后其他项目或类库将是客户端(Signalr 有包为“SignalR Javascript Client”和“SignalR .NET Client”) . Web 应用程序将消息作为 javascript 客户端,其他应用程序(如 winforms 或控制台)将消息作为 .net 客户端。这种机制是真正可扩展和可扩展的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多