首页 > 解决方案 > ASP.NET MVC 5 和 WCF 异步问题

问题描述

我们的应用程序使用 WCF 作为数据提供者,并且在某些页面上,我们对不同的服务进行了多次调用。我认为要优化的好部分,并开始将其重写为async. 所以在重写之前它看起来像

public ActionResult SomeAction(int id)
{
var r1 = AService.Call1();
var r2 = BService.Call2();
var r3 = CService.Call3();
//another logic
}

现在它变成了

public async Task<ActionResult> SomeAction(int id)
{
var r1 = await AService.Call1Async();
var r2 = await BService.Call2Async();
var r3 = await CService.Call3Async();
//another logic
}

使用这种方法,我面临两个问题:

  1. 在第一次服务调用后,应用程序陷入无休止的加载,并且没有执行其他操作。调试显示相同——第一次调用,之后什么都没有。
  2. 我们的一些类不能使用异步方法,例如我们的静态 AuthorizationProvider。

更新: @zuckerberg 回答有助于优化(我正在创建任务并将它们放入 awaitable Task.WhenAll()),但我仍然在 WCF 服务上挂起——虽然同步调用正常,异步调用将调用逻辑转入睡眠状态并且永远不会唤醒它.

标签: c#asp.net-mvcwcfasync-await

解决方案


使用 async/await 它们异步运行。这意味着他们不会等待对方或主线程。如果存在依赖关系,或者您需要在返回结果之前先等待所有 3 个完成,那么我建议使用类似的东西:

var r1 = await AService.Call1Async();
var r2 = await BService.Call2Async();
var r3 = await CService.Call3Async();

await Task.WhenAll(r1, r2, r3);
//more logic

希望这有助于将您推向正确的方向。但是,如果没有看到更多代码,我无法判断仅通过异步/等待您的调用是否会真正提高性能(它并不总是性能提升器),并且您的时间/精力可能会更好地花在其他地方。

祝你好运!


推荐阅读