【问题标题】:ASP.Net Core Razor components: await vs .ResultASP.Net Core Razor 组件:await vs .Result
【发布时间】:2018-06-18 12:50:50
【问题描述】:
在 ASP.Net Core 的视图文件中考虑以下两行:
@Component.InvokeAsync("Greeting").Result
@await Component.InvokeAsync("Greeting")
有什么区别?哪个更可取,在什么情况下?在我的代码中,它们都给出了相同的视觉结果;是否存在结果可能不同的情况?
【问题讨论】:
标签:
c#
asp.net-mvc
razor
asp.net-core-mvc
【解决方案1】:
两个调用很可能需要相同的时间才能返回,不同之处在于第一次调用会阻塞线程,而第二次调用会将线程返回到池中并允许它被另一个请求使用。本质上意味着您的服务可以在使用 await 关键字时每秒处理更多请求。
尽可能使用await 以防止线程阻塞。阅读 async 和 await - https://docs.microsoft.com/en-us/dotnet/csharp/async
来自 MSDN - await 关键字是魔法发生的地方。它将控制权交给执行 await 的方法的调用者,最终使 UI 具有响应性或服务具有弹性。
基本上await 关键字将控制权交还给调用者,并将线程释放回线程池。
【解决方案2】:
调用 .Result 将导致阻塞调用,可能导致您的 UI 出现问题。如果您正在调用异步函数,您应该await 以允许您的应用程序的其余部分继续运行而不会被阻塞。
【解决方案4】:
在组件上调用 .Result 会让你失去 await 的本质,它的目的是防止阻塞你的 UI,因为代码不需要等待完成Razor 组件的执行。
因此建议不要调用 .Result,而应等待结果以允许代码的完整异步执行流程。