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

本文关键字:有效 模式 是什么 控制器 运行 异步操作 WebApi | 更新日期: 2023-09-27 18:34:09

我正在开发一个带有最新 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);
    }
}

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

提前谢谢你。

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

正如评论中所讨论的,您最好的选择是执行以下操作之一:

  1. 创建您自己的自定义包装器,等待实际的网络 I/O 调用。因此,不仅仅是对 Task.Run 的调用。
  2. 按原样使用包装器并进行同步调用。

只是为了澄清。异步/等待模式用于卸载来自 CPU 绑定线程的 I/O 调用。这将允许服务器根据调用的性质处理更多并发请求。

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