c# - 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
}
使用这种方法,我面临两个问题:
- 在第一次服务调用后,应用程序陷入无休止的加载,并且没有执行其他操作。调试显示相同——第一次调用,之后什么都没有。
- 我们的一些类不能使用异步方法,例如我们的静态 AuthorizationProvider。
更新: @zuckerberg 回答有助于优化(我正在创建任务并将它们放入 awaitable Task.WhenAll()
),但我仍然在 WCF 服务上挂起——虽然同步调用正常,异步调用将调用逻辑转入睡眠状态并且永远不会唤醒它.
解决方案
使用 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
希望这有助于将您推向正确的方向。但是,如果没有看到更多代码,我无法判断仅通过异步/等待您的调用是否会真正提高性能(它并不总是性能提升器),并且您的时间/精力可能会更好地花在其他地方。
祝你好运!
推荐阅读
- python - 朴素贝叶斯的工作原理
- php - Laravel - 在 cron 作业中使用“睡眠”命令
- java - Drools 通过 Java API 定时执行规则
- javascript - 使用 Nest 设置两个不同的静态文件夹
- flutter - 约束高度在颤动中的行/列小部件中为无穷大
- android - 生成签名包(.aab)文件时图像文件上的Android Studio gradle错误
- javascript - 如何在漫长的过程中强制浏览器刷新视图
- python - 在 jupyter 笔记本中单击选项卡按钮后未获得自动列表/菜单
- javascript - 在第一个循环完成后在 jquery 中调用其他函数
- android - Android 字体选择器 GUI 在 Xml 设计中不可用