异步调用

时间:2017-06-15 14:12:38

标签: c# asp.net asynchronous async-await

我遇到了一个奇怪的情况,即没有向页面呈现asp.net验证控件。该控件位于最初隐藏的asp.net面板中,该面板根据async调用的结果显示。

以下是小组:

<asp:Panel ID="pnlGasReading" runat="server" Visible="false" CssClass="form-group clearfix">
    <asp:Label ID="lblFinalGasReading" runat="server" AssociatedControlID="txtFinalGasReading" Text="Final Gas Reading" />
    <flow:HelpText runat="server" ID="ucFinalGasReadingHelpText" HelpTextKey="ChangeOfTenancy-FinalGasReading" />
    <asp:TextBox ID="txtFinalGasReading" runat="server" CssClass="form-control" />
    <asp:RequiredFieldValidator runat="server" ID="valFinalGasReading" ControlToValidate="txtFinalGasReading" ErrorMessage="Final Gas Reading is required." ValidationGroup="COTForm" Display="Dynamic" CssClass="animate-error" />
</asp:Panel>

有问题的验证控件名为valFinalGasReading

这是异步调用,剪切到相关部分:

private async Task ConfigureAlreadyMovedMeterReadingFields()
{
    string accountId = _userContext.CurrentAccount.Id;

    var metersResponse = await _accountService.GetMetersForAccountAsync(accountId);

    if (metersResponse.IsSuccess)
    {
        var meters = metersResponse.ResponseContent.Meters;

        if (meters.Any())
        {
            if (meters.Any(x => x.Utility == MeterUtilityType.Gas))
            {
                pnlGasReading.Visible = true;
            }
        }
     }
}

这是在页面加载事件中通过以下方式调用的:

Page.RegisterAsyncTask(new PageAsyncTask(ConfigureAlreadyMovedMeterReadingFields));

因为这个电话基本上是“开始并且忘记了”。并且在继续执行剩余的页面执行之前不会等待我相信在异步方法调用完成之前页面加载已经完成。

我发现面板内的字段都显示,例如标签,文本框,帮助文本控件,但是必需的字段验证器没有。

是否有必要的字段验证器有什么特别之处,这意味着在页面加载完成之前它需要在页面上?有没有办法等待这个电话会议的结果,以便我们不会以这种竞争条件结束?

我试过标记页面加载async例如:

protected async void Page_Load(object sender, EventArgs e)

然后等待结果,但这会引发错误:

  

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。

1 个答案:

答案 0 :(得分:0)

在阅读Page.RegisterAsyncTaskPage.ExecuteRegisteredAsyncTasks上的文档后,它会说明Page.RegisterAsyncTask注册的任务将在页面PreRender事件中运行:

  

当为非异步页面调用任何已注册的异步任务(如果存在)时,将在页面处理中自动调用ExecuteRegisteredAsyncTasks方法。这种对ExecuteRegisteredAsyncTasks的自动调用发生在PreRenderComplete事件之前。

在页面生命周期中为时已晚。您可以通过Page.ExecuteRegisteredAsyncTasks立即运行任何排队的异步任务,这似乎可以解决我的问题,但是它无法解释为什么面板中的某些控件仍然可以正常工作TextBox / LabelRequiredFieldValidators必须有一些特殊内容,要求在PageLoad事件完成之前显示它们。