在客户端.net SignalR中调用服务器方法

本文关键字:调用 服务器 方法 SignalR 客户端 net | 更新日期: 2023-09-27 17:50:56

我是SignalR的初学者。我如何在客户端定义方法,并从服务器调用它。下面是我的代码:

in Server:

public class ChatHub : Hub
    {
        public void ServerMethod()
        {
            Clients.All.ClientMethod();
        }
    }

:

    HubConnection connection;
    IHubProxy proxy;
    public MainWindow()
    {
        InitializeComponent();
        connection = new HubConnection("LocalHostDomain");
        proxy = connection.CreateHubProxy("ChatHub");
    }
    private void Call_Click(object sender, RoutedEventArgs e)
    {
        proxy.Invoke("ServerMethod");
    }
    private void Start_Click(object sender, RoutedEventArgs e)
    {
        proxy.On("ClientMethod", () =>
        {
            tb1.Text = "Hello";
        });
        connection.Start().Wait();
    }

但tb1。文字不会改变!!这很简单,但我不知道怎么做!

在客户端.net SignalR中调用服务器方法

调用线程不能访问这个对象,因为它被另一个线程拥有。

SignalR在UI线程之外的另一个线程中处理传入消息。对UI 的更改必须始终在UI线程上执行。因此,需要同步访问。例如:

private void Start_Click(object sender, RoutedEventArgs e)
{
  proxy.On("ClientMethod", () => UpdateLabel());
  connection.Start().Wait();
}
private void UpdateLabel()
{
  if (InvokeRequired)
  {
    BeginInvoke(new Action(UpdateLabel));
    return;
  }
  tb1.Text = "Hello";
}

你可以这样做

private void Start_Click(object sender, RoutedEventArgs e)
{
    proxy.On("ClientMethod", () =>
    {
        change_text("Hello");
    });
}
private void change_text(string text)
    {
       if (tb1.InvokeRequired)
        {
            tb1.Invoke(new MethodInvoker(delegate { tb1.Text = text; }));
        }
        else
        {
            tb1.Text = text;
        }
    }

可以更改文本,而不必为其添加方法。我只是给你一个想法怎么做