我们的应用程序使用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
}
使用这种方法,我面临两个问题:
更新:@zuckerberg的答案有助于优化(我正在创建任务并将其放在等待的Task.WhenAll()
中),但我仍然挂在WCF服务上—在同步调用时正常运行时,异步调用使调用逻辑进入睡眠状态,再也不会唤醒它。
答案 0 :(得分:0)
与异步/等待它们异步运行。这意味着他们不等待对方或主线程。如果存在依赖关系,或者您需要先等待所有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 :(得分:0)
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指出正确的方向。