SignalR和WinRT客户端:不要在Start()上调用Wait()

时间:2014-05-23 18:07:26

标签: c# .net windows-runtime signalr

我对SignalR的官方文档有疑问 - Hubs API Guide - .NET Client。在 - 如何建立连接部分中。它写了以下内容:

  

Start方法异步执行。确保随后   在建立连接之前,代码行不会执行,   在ASP.NET 4.5异步方法中使用await或在.a中使用.Wait()   同步方法。不要在WinRT客户端中使用.Wait()。

有谁知道不打电话给Wait()的具体原因是什么?此外,当我有一个WinRT客户端,我与服务器hubProxy.Invoke()通话时,这也适用吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

来自评论:

  

没有提到与异步或同步相关的内容   码。默认情况下代码WinRT是否异步,或者有什么东西   否则,我不知道或不理解?

在客户端UI应用程序(包括WinRT)中,至少有两个不阻止的原因:

  • 避免阻止用户界面并保持流畅;
  • 避免Stephen Cleary's blog中描述的死锁,以防当前堆栈帧中当前调用链中有await的情况;

后者对WinRT尤为重要,因为异步是普遍存在的。整个WinRT框架设计为"async all the way down",因此如果您在UI线程的任何位置使用task.Waittask.Result,则很可能会造成死锁

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

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

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