SignalR .Net客户端 - 如何同步和异步调用

And*_*ens 1 signalr signalr.client

我正在使用.Net客户端(而不是javascript)学习SignalR,并希望澄清如何以同步或异步方式调用集线器代理方法.

没有返回值的方法

到目前为止,我一直在做这样的事情: -

myHubProxy.Invoke("DoSomething");
Run Code Online (Sandbox Code Playgroud)

我发现这是异步的,这很好,因为它实际上是"一劳永逸",并且不需要等待返回值.但有几个问题: -

  1. 在try..catch块中包装Invoke是否有任何影响,特别是它是异步的?我可能想知道呼叫是否失败.
  2. 是否有任何情况需要调用不同步返回值的方法?我已经看到了提到的.Wait()方法,但我想不出你为什么要这样做.

返回值的方法

到目前为止,我一直在使用该Result物业,例如: -

var returnValue = myHubProxy.Invoke<string>("DoSomething").Result;
Console.WriteLine(returnValue);
Run Code Online (Sandbox Code Playgroud)

我假设它同步工作 - 毕竟,在返回结果之前,它无法进入下一行.但是我如何异步调用这样的方法呢?是否有可能指定一个回调方法,或者我现在应该真的使用async/await(这是我承认还没有学到的东西)?

Ste*_*ary 5

如果要编写异步代码,则应使用async/ await.我在我的博客上有一个介绍,最后有一些后续资源.

当您启动异步操作(例如,Invoke)时,您将获得一个任务.该Task类型用于没有返回值的异步操作,并Task<T>用于具有返回值的异步操作.这些任务类型可以在操作完成时指示您的代码,以及它是成功完成还是错误.

虽然你可以使用Task.WaitTask<T>.Result,但我不推荐它们.首先,它们将任何异常包装在一起,AggregateException这使得您的错误处理代码更加繁琐.它使用起来容易得多await,而不是这种包装.同样,您可以使用注册回调ContinueWith,但我不推荐它; 你需要了解很多关于任务调度程序以及正确使用它的东西.它更容易使用await,默认情况下(最可能)正确的做法.