在WebApi控制器中运行异步操作的好的和有效的模式是什么?

时间:2016-02-10 21:49:55

标签: c# asp.net asp.net-web-api asp.net-core

我正在使用最新的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);
    }
}

这是进行异步服务调用的好模式吗?或者这个案例的有效实施是什么?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的那样,最好的办法是做其中一项:

  1. 创建自己的自定义包装器,等待实际的网络I / O调用。所以不只是调用Task.Run。
  2. 按原样使用包装并进行同步调用。
  3. 只是澄清一下。 async / await模式用于从CPU绑定线程卸载I / O调用。这将允许服务器根据调用的性质处理更多的同时请求。

    来自客户端的调用(尤其是像JavaScript)不会受到任何影响。默认情况下,几乎所有JavaScript调用都是异步的,因为它们在操作完成时有一个回调(有一些方法可以覆盖它并让JavaScript调用等待返回,但通常不会这样做。)