【发布时间】:2014-08-05 23:12:23
【问题描述】:
我正在编写一个小 WPF 应用程序来测试一些 SignalR 代码。一切都从我写的东西开始,但我偶然发现了一些我不确定的东西。
我为HubConnection StateChanged 事件创建了一个事件处理程序;
_hub.StateChanged += (change) =>
{
Console.WriteLine("hubConnection.StateChanged {0} => {1}", change.OldState, change.NewState);
if (change.NewState == ConnectionState.Connecting)
{
statusCallBack callBack = new statusCallBack(UpdateStatus);
this.Dispatcher.Invoke(callBack, "hubConnection.StateChanged");
}
if (change.NewState == ConnectionState.Connected)
{
Console.WriteLine("hello");
statusCallBack callBack = new statusCallBack(UpdateStatus);
this.Dispatcher.Invoke(callBack, "hubConnection.StateChanged");
}
};
使用我的 Delegate 方法 statusCallBack 和方法;
delegate void statusCallBack(string msg);
private void UpdateStatus(string msg)
{
if (this.Dispatcher.CheckAccess() == true)
{
this.tbStatus.AppendText(Environment.NewLine + DateTime.Now.ToLongTimeString() + " --- " + msg);
this.tbStatus.CaretIndex = this.tbStatus.Text.Length;
this.tbStatus.ScrollToEnd();
}
}
现在我可能在这里遗漏了一些非常明显的东西,但是当在StateChanged 处理程序中检查ConnectionState.Connecting 并将消息输出到我的标签时它工作正常。
然后,当 SignalR HubConnection 状态更改为 ConnectionState.Connected 并且我尝试调用委托时,WPF 应用程序就会锁定。
它将正常输出到控制台,并检查是否change.NewState == ConnectionState.Connected,然后将“hello”输出到控制台,但随后就冻结了。
如果我调试应用程序,当它进入 Connected if 语句时,对象 change.NewState 和 change.OldState 会出现以下错误消息。
我不知道为什么它在第一个 if 语句中起作用,但在第二个语句中不起作用。还有为什么它能够将正确的值输出到控制台?
即使我注释掉最初的if 语句以检查Connecting,它仍然会在Connected 时冻结。
【问题讨论】:
标签: c# signalr dispatcher signalr.client