【问题标题】:SignalR self-host windows form - UI Interaction Between Hub and GUISignalR 自托管窗口形式 - 集线器和 GUI 之间的 UI 交互
【发布时间】:2015-10-21 21:53:12
【问题描述】:

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

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

如何将集线器的方法生成的文本推送到 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);
    }
}

【问题讨论】:

  • 很好,你的问题是什么?
  • 您好,我刚刚将查询标记为粗体,但总而言之:如何将集线器方法生成的文本推送到 GUI 的文本框控件?

标签: c# signalr signalr-hub signalr.client


【解决方案1】:

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

【讨论】:

  • AWinkle 是对的,我认为这里要考虑的主要问题是:将您的 UI 与集线器分开。在您的应用程序中托管中心并让它同时充当中心的客户端。这将为您省去很多麻烦。几乎是same approach here
  • 感谢您的回复。 @rdoubleui - 当我看到你的评论进来时,我只是在回复。是的,在玩了它之后,我意识到这就是 AWinkle 的方法。我同意 - 我想将我的服务器 GUI 与 Hub 创建分开,所以看起来这是要走的路,我会看看我如何继续... AWinkle 和 rdoubleui - 谢谢各位!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多