SignalR自宿主窗口形式-集线器和GUI之间的UI交互

本文关键字:GUI 之间 交互 UI 集线器 宿主 窗口 SignalR | 更新日期: 2023-09-27 18:05:45

嗨,我已经创建了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是初始化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类(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自宿主窗口形式-集线器和GUI之间的UI交互

我刚刚开始玩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;}
    }
}