繁体   English   中英

ASP.NET MVC 5和WCF异步故障

[英]ASP.NET MVC 5 and WCF async troubles

我们的应用程序使用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答案有助于优化(我正在创建任务并将其放入等待的Task.WhenAll() ),但我仍然挂在WCF服务上—同步调用正常进行,异步调用使调用逻辑进入睡眠状态永不唤醒。

与异步/等待它们异步运行。 这意味着他们不等待对方或主线程。 如果存在依赖关系,或者您需要先等待所有3个对象完成才能返回结果,则建议使用类似以下内容的方法:

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

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

希望这可以帮助您朝正确的方向前进。 但是,在没有看到更多代码的情况下,我无法确定仅通过异步/等待来改善您的呼叫是否会真正提高性能(这并不总是提高性能),并且您的时间/精力可能会花在其他地方。

祝好运!

1.使用静态类的构造函数的内部异步调用来启动函数不是一个好主意,但SomeMethodAsync().Result帮助-控制器当然没有任何好处,但是在那种情况下,它是可以接受的。

2.是的,我误解了async/await ,所以我将代码重写为如下形式:

var get1Task = AService.Call1Async();
var get2Task = BService.Call2Async();
var get3Task = CService.Call3Async();

await Task.WhenAll(get1Task, get2Task, get3Task);
var r1 = get1Task.Result;
var r2 = get2Task.Result;
var r3 = get3Task.Result;
//more logic

这使我在使用许多WCF调用的页面上获得了很好的加速效果,我感到很高兴。

感谢@zuckerberg指出正确的方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM