我正在编写一个小 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”输出到控制台,但随后就冻结了。
如果我调试应用程序,当它进入 Connectedif
语句时,对象change.NewState
并change.OldState
在下面显示错误消息。
我不知道为什么它在第一个 if 语句中起作用,而不是第二个。还有为什么它能够将正确的值输出到控制台?
即使我注释掉初始if
语句以检查Connecting
它仍然会在Connected
.