SignalR和WinRT客户端:不要在Start()上调用Wait()
我对SignalR的官方文档有疑问 – Hubs API Guide – .NET Client 。 在“ 如何建立连接”部分中 。 它写了以下内容:
Start方法异步执行。 要确保在建立连接之后不执行后续代码行,请在ASP.NET 4.5异步方法中使用await,或在同步方法中使用.Wait()。 不要在WinRT客户端中使用.Wait()。
有谁知道不打电话给Wait()的具体原因是什么? 此外,当我有一个WinRT客户端,我与hubProxy.Invoke()
调用服务器时,这也适用吗?
谢谢您的帮助!
来自评论:
没有提到异步或同步代码。 默认情况下代码WinRT是异步还是还有其他我不知道或不理解的东西?
在客户端UI应用程序(包括WinRT)中,至少有两个不阻止的原因:
- 避免阻止用户界面并保持流畅;
- 避免斯蒂芬克莱里博客中描述的僵局,以避免在当前的调用链中
await
上层堆栈帧;
后者对于WinRT尤为重要,因为异步是普遍存在的。 整个WinRT框架被设计为“一直向下异步” ,所以如果你在UI线程的任何地方使用task.Wait
或task.Result
你很可能会创建一个死锁。
对于服务器端ASP.NET应用程序,还有至少两个不阻止的原因:
- 阻止会使您的Web应用程序的可伸缩性降低,因为被阻止的线程可能正在为其他传入的HTTP请
- 同样的死锁场景。
您可能需要浏览async-await
wiki中的链接列表以获取更多阅读材料。