メッセージを UI にプッシュし、Web サービスから同期的に返される結果を受信しようとしています。メソッドコードは次のようになります。
[OperationContract]
public string DecypherCaptcha(string captcha)
{
var connection = new HubConnection("http://localhost:51806");
IHubProxy hub = connection.CreateHubProxy("robo");
string decaptcha = null;
hub.On("captchaDecyphered", decyphered =>
{
decaptcha = decyphered;
});
connection.Start().Wait();
hub.Invoke<string>("DecypherCaptcha", new object[] { captcha });
return decaptcha;
}
問題は、値がハブの から取得される前にメソッドが終了することですcaptchaDecyphered
。ただし、{ decaptcha = decyphered; }
メソッドが終了した後、式はサーバーから正常にトリガーされます。フラグを
追加しても、実行がフリーズして発火を防止する問題は解決しません。これを同期する方法はありますか?UPDATE#1小さなお知らせ。SignalR クライアントとして機能する中間同期 WCF Web サービスの使用を避けることはできません。これは、Web サービスを同期的に呼び出すことによってのみ外界と対話できる非常に特殊なロボットが後ろに座っているためです。基本的にこのシナリオでは、ロボットがキャプチャに直面すると、手動認識のために SignalR を介して UI に渡す Web サービスを呼び出します。更新#2ManualResetEvent
WaitOne()
hub.On("captchaDecyphered"
@Ken の感動的なアドバイスのおかげで、接続の確立とハブ メソッドの呼び出しを別の「スレッド」に囲み、続いて「ManualResetEvent」で待機することで機能するようになりました。
new Thread(() =>
{
connection.Start().Wait();
hub.Invoke<string>("DecypherCaptcha", new object[] { captcha });
}).Start();
sync.WaitOne();
以前は、暗黙的に別のスレッドで実行されると仮定して「タスク」から開始しようとしましたが、うまくいきませんでした。