在 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);
}
}
这是执行异步服务调用的良好模式吗?或者这个案件的良好和有效的实施是什么?
提前谢谢你。
正如评论中所讨论的,您最好的选择是执行以下操作之一:
- 创建您自己的自定义包装器,等待实际的网络 I/O 调用。因此,不仅仅是对 Task.Run 的调用。
- 按原样使用包装器并进行同步调用。
只是为了澄清。异步/等待模式用于卸载来自 CPU 绑定线程的 I/O 调用。这将允许服务器根据调用的性质处理更多并发请求。
来自客户端的调用(尤其是像 JavaScript)不会受到任何一种方式的影响。默认情况下,几乎所有的 JavaScript 调用都是异步的,因为它们在操作完成时有一个回调(有一些方法可以覆盖它并让 JavaScript 调用等待返回,但这通常永远不会完成)。