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

时间:2014-03-18 13:41:02

标签: c# signalr

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

服务器中的

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.Text不会改变!!它非常简单,但我不知道该怎么做!

2 个答案:

答案 0 :(得分:0)

  

调用线程无法访问此对象,因为另一个线程拥有它。

SignalR处理除UI线程之外的另一个线程中的incomming消息。必须始终在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";
}

答案 1 :(得分:0)

这就是你如何做到的

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;
        }
    }

您可以更改文本而无需使用方法。我只是给你并想出怎么做。