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