asp:DataGrid的async可见性

本文关键字:async 可见性 DataGrid asp | 更新日期: 2023-09-27 18:02:50

.NET 4.5.2,Windows 8.1 x64上的IIS 8.5。我在localhost/上有一个ASP.NET网站。

我有一个真正的异步谜题,我已经纠结了两天了。

我正在将一些长期运行的报告重新设计为异步的,但我可以用非常简单的代码来证明我的问题。

我的页面上有一个asp:DataGrid,我最初将其设置为visible="false"。它应该只有在填充时才可见。我的问题是,如果填充它的代码是异步的,我看不到网格!

这是标记:

<body>
    <form runat="server">
        <asp:datagrid ID="grid" visible="false" Runat="server"></asp:datagrid>
    </form>
</body>

在代码背后,这个代码工作:

void Page_Load()
{
    grid.DataSource = new Dictionary<string, string>()
    {
        { "col1", "value1" }
    };
    grid.DataBind();
    grid.Visible = true;
}

现在,如果我做两个更改:

将Async="True"添加到@Page指令用此替换Page_Load

void Page_Load()
{
    this.RegisterAsyncTask(new PageAsyncTask(async () =>
        {
            grid.DataSource = new Dictionary<string, string>()
            {
                { "col1", "value1" }
            };
            grid.DataBind();
            grid.Visible = true;
        }));
}

不会渲染栅格。请注意,尽管委托中没有等待,但我还是使用了async关键字。我尝试了几种方法,结果都是一样的:

  1. 添加等待任务。延迟(…(
  2. 删除async关键字并返回Task.FromResult(0(

我覆盖并插入了页面生命周期事件,以查看网格何时填充以及其可见性如何变化。这是我看到的输出:

OnPreInit: Visible=False Rows=0 Thread=63
OnInit: Visible=False Rows=0 Thread=63
OnInitComplete: Visible=False Rows=0 Thread=63
OnPreLoad: Visible=False Rows=0 Thread=63
OnLoad: Visible=False Rows=0 Thread=63
OnLoadComplete: Visible=False Rows=0 Thread=63
OnPreRender: Visible=False Rows=0 Thread=63
Async 1: Visible=False Rows=0 Thread=63
Async 2: Visible=True Rows=1 Thread=63
OnPreRenderComplete: Visible=True Rows=1 Thread=63
OnSaveStateComplete: Visible=True Rows=1 Thread=63
Render 1: Visible=True Rows=1 Thread=63
Render 2: Visible=True Rows=1 Thread=63

"异步1"answers"2"位于委托内部网格填充的两侧。您可以看到网格正在生成一行,其可见性变为真,但未进行渲染。如果我同步地用我的第一个代码样本填充网格,那么一切都很好。

另一个注意事项:我可以将网格封装在另一个控件中以使其工作:

<body>
    <form runat="server">
        <div id="container" visible="false" runat="server">
            <asp:datagrid ID="grid" Runat="server"></asp:datagrid>
        </div>
    </form>
</body>

似乎是asp:datagrid本身的visible="false"搞砸了这件事。

我做错了什么?

asp:DataGrid的async可见性

尝试将网格放置在UpdatePanel中,并在UpdatePanel 的OnLoad事件上调用异步方法(在网格中加载数据并管理其可见性(

假设RegisterAsyncTask返回promise,请尝试

this.RegistreAsyncTask(
 async () => 
    {
       return new Dictionary<string, string>(){
         { "col1", "value1" }
       };
    }
).then(dataSource => {grid.DataSource = dataSource; grid.visible = true})

async在不同的后台线程中运行,PromiseUI thread中解析(与类似的android概念有关(