Я пишу небольшое приложение 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
, затем выведет «привет» на консоль, но потом просто зависнет.
Если я отлаживаю приложение, когда оно попадает в оператор Connected if
, объекты change.NewState
и change.OldState
имеют сообщение об ошибке ниже.
Просмотреть увеличенное изображение здесь.
Я не понимаю, почему это работает в первом операторе if, но не во втором. Также почему он может выводить правильные значения в консоль?
Даже если я закомментирую начальный оператор if
для проверки Connecting
, он все равно зависнет, когда Connected
.