SignalR 自托管 windows 形式 - UI 集线器与 GUI 的交互

SignalR self-host windows form - UI Interaction Between Hub and GUI

您好,我创建了 2 个 winform 应用程序,一个充当服务器(自托管),另一个充当客户端。我的服务器应用程序有一个用于停止和启动服务器/集线器的按钮以及一个用于显示日志记录信息的文本框。

我可以在这两个应用程序之间成功发送消息,也就是说客户端从服务器接收消息,反之亦然,这很好用,但我唯一的问题是允许集线器的首选方式是什么,当一条消息发送或接收,以在文本框中显示,用于调试/信息目的。

如何将集线器方法生成的文本推送到 GUI 的文本框控件?

我的代码如下所示:

Winform GUI代码

public partial class Form2 : Form
{
    private IDisposable _SignalR;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this._SignalR = WebApp.Start<Startup>("http://localhost:8080");
    }
}

Startup 是我的名字class 用来初始化Hub

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        try
        {
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);

                HubConfiguration hubConfiguration = new HubConfiguration
                {
                    EnableDetailedErrors = true,
                    EnableJSONP = true
                };

                map.RunSignalR(hubConfiguration);
            });
        }
        catch(Exception)
        {
            throw;
        }

    }
}

我的 Hub class (TestHub) 看起来像这样,我已经指出了我想将字符串传输到 GUI 的位置:

public class TestHub : Hub
{
    public override Task OnConnected()
    {
        string message = string.Format("Client connected: {0}", Context.ConnectionId);
        // Want to send details of connected user to GUI

        return base.OnConnected();
    }

    public override Task OnDisconnected(bool graceFull)
    {
        string message = string.Format("Client disconnected: {0}", Context.ConnectionId);
        // Want to send details of disconnected user to GUI

        return base.OnDisconnected(graceFull);
    }


    public void SendAll(string message)
    {
        // Want to send details of actionto GUI

        Clients.All.addMessage(message);
    }
}

我自己刚刚开始使用 SignalR,所以我理解您的困惑。我提供了对我最有帮助的资源的链接以及针对您的具体示例的答案。

http://www.asp.net/signalr/overview/guide-to-the-api

工作示例:https://code.msdn.microsoft.com/Using-SignalR-in-WinForms-f1ec847b/file/119892/19/Using%20SignalR%20in%20WinForms%20and%20WPF.zip

public partial class Form2 : Form
{
    private IDisposable _SignalR;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this._SignalR = new HubConnection("http://localhost:8080").CreateHubProxy("TestHub");
        this._SignalR.On<string>("SendAll", message => { textbox1.Text = message;}
    }
}