尝试将消息推送到 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; }
在方法退出后从服务器触发正常。
添加ManualResetEvent
标志并WaitOne()
因为它并不能解决冻结执行和防止hub.On("captchaDecyphered"
触发的问题。任何想法如何同步这个?
UPDATE#1 小通知。无法避免使用充当 SignalR 客户端的中间同步 WCF Web 服务,因为非常特定的机器人坐在后面,它们只能通过同步调用 Web 服务来与外部世界交互。基本上在这种情况下,当机器人面对验证码时,它会调用 Web 服务,通过 SignalR 将其传递给 UI 以进行手动识别。
更新#2感谢@Ken 的鼓舞人心的建议,通过将连接建立和集线器方法调用封闭到单独的“线程”中,然后等待“ManualResetEvent”,使其工作:
new Thread(() =>
{
connection.Start().Wait();
hub.Invoke<string>("DecypherCaptcha", new object[] { captcha });
}).Start();
sync.WaitOne();
以前一直试图从“任务”开始,假设它会隐式地在单独的线程上运行,但没有运气。