SignalR コードをテストするために、小さな WPF アプリケーションを作成しています。私が書いたことからすべてが機能しますが、よくわからないものに出くわしました。
イベントのイベント ハンドラーを作成しました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");
}
};
私のデリゲートメソッド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 アプリがロックされます。
コンソールに正常に出力され、コンソールに「hello」が出力されるかどうかを確認しますchange.NewState == ConnectionState.Connected
が、フリーズします。
if
アプリをデバッグすると、Connectedステートメント内に到達するchange.NewState
と、オブジェクトchange.OldState
が表示され、以下のエラー メッセージが表示されます。
最初の if ステートメントでは機能するのに、2 番目の if ステートメントでは機能しない理由がわかりません。また、正しい値をコンソールに出力できるのはなぜですか?
if
チェックするために最初のステートメントをコメントアウトしてもConnecting
、Connected
.