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.Waittask.Result你很可能会创建一个死锁。

对于服务器端ASP.NET应用程序,还有至少两个不阻止的原因:

  • 阻止会使您的Web应用程序的可伸缩性降低,因为被阻止的线程可能正在为其他传入的HTTP请
  • 同样的死锁场景。

您可能需要浏览async-await wiki中的链接列表以获取更多阅读材料。