我是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不会改变!!它非常简单,但我不知道该怎么做!
答案 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;
}
}
您可以更改文本而无需使用方法。我只是给你并想出怎么做。