我正在使用最新的ASP.Net 5 RC1开发WebApi。数据提供程序是第三方WCF服务。我只有合同(作为包含服务接口的dll提供)并且我想异步调用服务操作但是wcf服务不提供异步操作。所以我只想弄清楚我应该使用的正确模式。所以目前,服务客户端类看起来像这样(MyServiceClient:IMyServiceClient):
ChannelFactory<IServiceInterface> channelFactory;
...
public IResult DoAServiceCall(object param)
{
var channel = channelFactory.CreateChannel();
return channel.DoSomething(new Request() {Param = param});
}
public async Task<IResult> DoAServiceCallAsync(object param)
{
var result = await Task.Run(() => DoAServiceCall(param));
return result;
}
WebApi控制器是这样的:
public class SampleController : Controller
{
private IMyServiceClient serviceClient;
public SampleController(IMyServiceClient serviceClient)
{
this.serviceClient = serviceClient
}
[HttpGet]
[Route("api/getsomething")]
public async Task<IResult> Get(int p)
{
return await serviceClient.DoAServiceCallAsync(p);
}
}
这是进行异步服务调用的好模式吗?或者这个案例的有效实施是什么?
提前谢谢。
答案 0 :(得分:1)
正如评论中所讨论的那样,最好的办法是做其中一项:
只是澄清一下。 async / await模式用于从CPU绑定线程卸载I / O调用。这将允许服务器根据调用的性质处理更多的同时请求。
来自客户端的调用(尤其是像JavaScript)不会受到任何影响。默认情况下,几乎所有JavaScript调用都是异步的,因为它们在操作完成时有一个回调(有一些方法可以覆盖它并让JavaScript调用等待返回,但通常不会这样做。)