在客户端.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。文字不会改变!!这很简单,但我不知道怎么做!
调用线程不能访问这个对象,因为它被另一个线程拥有。
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;
}
}
可以更改文本,而不必为其添加方法。我只是给你一个想法怎么做