如何从MVC4控件(.ascx文件)调用异步方法?

时间:2018-02-07 19:57:20

标签: c# asp.net-mvc asp.net-mvc-4 asynchronous

重新考虑我的MVC4应用程序以引入一些异步代码。但是,有几个.ascx和.aspx文件是调​​用异步方法。例如,

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModel>" %>
<div id="connection-config-settings">
    <%
        var authorizationContext = this.AuthorizationContext();
        if (await authorizationContext.ConfigurationAuthorization.CanUserUpdateConfig())
        {
     %>
             <pre>The user can update configuration</pre>
      <% }
         else
         {
       %>
             <pre>The user can NOT update configuration</pre>
       <%
         }
       %>
</div>

毫不奇怪,我收到的错误是await只能在标有&#39; async&#39;的方法中使用。我真的不想通过使用GetAwaiter()。GetResult()或.Result或其他黑客来阻止异步调用。我一直在阅读很多关于异步编程的最佳实践,以下两个资源强烈建议永远不要阻止异步调用。

How to call asynchronous method from synchronous method in C#?

https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

如何从我的.ascx文件中调用异步方法?

2 个答案:

答案 0 :(得分:0)

ASP.NET Web Forms 4.5中的异步是this documentation

首先,将代码移至* .aspx(ascx).cs后端。

其次,注册你的异步方法如下:

public bool UserCanUpdate = false;

protected void Page_Load(object sender, EventArgs e)
{
    RegisterAsyncTask(new PageAsyncTask(UserCanUpdateAsync));
}

private async Task UserCanUpdateAsync()
{
    var authorizationContext = this.AuthorizationContext();
    UserCanUpdate = await authorizationContext.ConfigurationAuthorization.CanUserUpdateConfig();
}

第三步,将Control属性添加到页面(控制)指令

<%@ Control Async="true" Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModel>" %>

答案 1 :(得分:0)

我使用的解决方案是不在.aspx或.ascx文件中进行任何异步调用。而是将异步方法调用中的数据加载到异步控制器中的ViewData中,然后一起绕过问题。