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

Signalr Net客户端-如何同步和异步调用,signalr,signalr.client,Signalr,Signalr.client,我正在学习使用.Net客户端(而不是javascript)的SignalR,并希望对如何以同步或异步方式调用集线器代理方法进行一些澄清 没有返回值的方法 到目前为止,我一直在做这样的事情:- myHubProxy.Invoke("DoSomething"); 我发现这是异步的,这很好,因为它实际上是“启动并忘记”的,不需要等待返回值。不过有几个问题:- 在try..catch块中包装调用是否有任何影响,特别是在异步的情况下?我可能想知道电话是否失败了 是否有任何场景需要调用不同步返回值的方法?

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

没有返回值的方法

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

myHubProxy.Invoke("DoSomething");
我发现这是异步的,这很好,因为它实际上是“启动并忘记”的,不需要等待返回值。不过有几个问题:-

  • 在try..catch块中包装调用是否有任何影响,特别是在异步的情况下?我可能想知道电话是否失败了
  • 是否有任何场景需要调用不同步返回值的方法?我见过上面提到的.Wait()方法,但我不明白您为什么要这样做
  • 返回值的方法

    到目前为止,我一直在使用
    Result
    属性,例如:-

    var returnValue = myHubProxy.Invoke<string>("DoSomething").Result;
    Console.WriteLine(returnValue);
    
    var returnValue=myHubProxy.Invoke(“DoSomething”).Result;
    Console.WriteLine(返回值);
    

    我假设这是同步工作的——毕竟,在返回结果之前,它无法进入下一行。但是如何异步调用这样的方法呢?是否可以指定回调方法,或者这些天我真的应该使用async/await(我承认仍然没有了解到这一点)?

    属性返回一个异步任务,因此服务器请求仍然是异步执行的。 没有理由在调用期间挂起线程,这就是为什么要使用异步

    如果在GUI线程上启动调用,则更重要的是使其异步,否则在调用完成时GUI将不会响应

    1) 如果您希望try-catch块实际捕获服务器故障,那么您需要使用wait关键字。像

    try
    {
        var foo = await proxy.Invoke<string>("Bar");
    }
    catch (Exception ex)
    {
        //act on error
    }
    
    试试看
    {
    var foo=await proxy.Invoke(“Bar”);
    }
    捕获(例外情况除外)
    {
    //对错误采取行动
    }
    

    2) 我想你应该问一下,是否有理由称它为异步的?是的,就像我说的,您不想在请求发出时阻止任何线程

    .Result
    属性返回一个异步任务,因此服务器请求仍然是异步执行的。 没有理由在调用期间挂起线程,这就是为什么要使用异步

    如果在GUI线程上启动调用,则更重要的是使其异步,否则在调用完成时GUI将不会响应

    1) 如果您希望try-catch块实际捕获服务器故障,那么您需要使用wait关键字。像

    try
    {
        var foo = await proxy.Invoke<string>("Bar");
    }
    catch (Exception ex)
    {
        //act on error
    }
    
    试试看
    {
    var foo=await proxy.Invoke(“Bar”);
    }
    捕获(例外情况除外)
    {
    //对错误采取行动
    }
    

    2) 我想你应该问一下,是否有理由称它为异步的?是的,就像我说的,您不想在发出请求时阻止任何线程

    如果您想编写异步代码,那么您应该使用
    异步
    /
    等待

    当您启动一个异步操作(例如,
    调用
    )时,您将返回一个任务。
    Task
    类型用于不带返回值的异步操作,
    Task
    用于带返回值的异步操作。这些任务类型可以向代码指示操作何时完成,以及操作是成功完成还是有错误完成


    虽然您可以使用
    Task.Wait
    Task.Result
    ,但我不推荐它们。首先,它们将所有异常包装在一个
    聚合异常中
    ,这使得错误处理代码更加繁琐。使用
    wait
    要容易得多,因为它不进行这种包装。类似地,您可以使用
    ContinueWith
    注册回调,但我不推荐这样做;要正确使用任务调度器,您需要了解很多关于任务调度器的知识。使用
    await
    要容易得多,默认情况下它做的事情(很可能)是正确的。

    如果您想编写异步代码,那么应该使用
    async
    /
    await

    当您启动一个异步操作(例如,
    调用
    )时,您将返回一个任务。
    Task
    类型用于不带返回值的异步操作,
    Task
    用于带返回值的异步操作。这些任务类型可以向代码指示操作何时完成,以及操作是成功完成还是有错误完成


    虽然您可以使用
    Task.Wait
    Task.Result
    ,但我不推荐它们。首先,它们将所有异常包装在一个
    聚合异常中
    ,这使得错误处理代码更加繁琐。使用
    wait
    要容易得多,因为它不进行这种包装。类似地,您可以使用
    ContinueWith
    注册回调,但我不推荐这样做;要正确使用任务调度器,您需要了解很多关于任务调度器的知识。使用
    await
    要容易得多,它在默认情况下做(很可能)正确的事情。

    我还不清楚如何异步调用
    Invoke
    ,然后让线程在服务器方法运行时处理其他事情。当调用完成时,我想对返回值做一些事情,有点像回调委托(在引入async/await之前是一种常见的方法)。我不确定使用async/await的等效代码是什么。我仍然不清楚如何异步调用
    Invoke
    ,然后在服务器方法运行时让线程继续处理其他事情。当调用完成时,我想对返回值做一些事情,有点像回调委托(在引入async/await之前是一种常见的方法)。我不确定使用async/await的等效代码是什么。好的,我想我现在已经知道了:我将编写一个方法(标记为
    async
    ),其中包含调用(标记为
    await
    ),然后是执行som的代码