我有许多Web服务,它们都实现了我想从另一个应用程序调用的相同接口。
在每个Web服务上,我需要依次调用两个方法A()和B(),并且我想检查每次调用的响应是否有错误(不是异常)。我正在尝试使用异步来完成所有操作,但是我很难理解何时可以检查方法的响应是否有错误,如果我在调用异步之后进行检查,则会得到NullReferenceException(可以理解),但是该怎么做我将两种方法的结果结合起来吗?
以下是没有任何结果检查的代码概述
List<DeviceClient> clients; // List of client interfaces to web-service
var startTasks = clients.Select(dc => SetupDevice(dc.Client);
await Task.WhenAll(startTasks);
...
private async Task SetupDevice(DeviceClient client)
{
await client.A();
await client.B();
}
我想做的是检查A()的结果,如果失败,则抛出一个异常,与B()相同。
private async Task SetupDevice(DeviceClient client)
{
var respA = await client.A();
if (respA.Error)
throw new Exception("A failed");
var respB = await client.B();
if (respB.Error)
throw new Exception("B failed");
}
但是,由于对A()的调用是异步的,因此respA将为null。这可能吗,还是我需要分别在对A()和B()的调用上调用GetAwaiter()。GetResult()?
即使我必须同步处理每个客户端上对A()和B()的单独调用,我仍然希望将不同的客户端异步调用-如果可以的话。
谢谢,Canice。
但是,由于对A()的调用是异步的,因此respA将为null。
那不是为什么null
。唯一的办法respA
可能null
是,如果A()
返回null
。如果null
是有效的返回值,但不能使用该值,则也要检查该值:
private async Task SetupDevice(DeviceClient client)
{
var respA = await client.A();
if (respA == null || respA.Error)
throw new Exception("A failed");
var respB = await client.B();
if (respB == null || respB.Error)
throw new Exception("B failed");
}
该await
关键字已经解开的结果给你,所以没有必要使用GetAwaiter().GetResult()
。这样做:
var respA = client.A().GetAwaiter().GetResult();
会在中为您提供相同的值respA
,但会在等待线程时将其阻塞,这意味着它将不再是异步的。
Microsoft建议您阅读有关使用async
/的相当不错的文章await
。它们可以帮助您准确了解发生了什么:异步编程和异步等待
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句