单击按钮时异步填充gridview

本文关键字:填充 gridview 异步 按钮 单击 | 更新日期: 2023-09-27 18:13:19

我想填充一个Gridview,这是一个更新面板上的按钮单击。目前gridview正在填充,但没有显示在屏幕上。我错过了什么?下面是我使用的代码:

  public delegate void BindGrid_Delegate();
  protected void btnSearch_Click(object sender, EventArgs e)
  {
        try
        {
            // databind of all the controls
            BindGrid_Delegate bd = new  BindGrid_Delegate(BindGrid);
            IAsyncResult ar = bd.BeginInvoke(null, null); //invoking the method
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "PageException", "alert('" + ex.Message + "');", true);
        }
  }
  private void BindGrid()
  {
      try
      {
          DataSet ResultDataSet = GetData();
          gvShowResult.DataSource = ResultDataSet; 
          gvShowResult.DataBind();
          UpdatePanel2.Update();
      }
      catch (Exception ex)
      {
          ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "PageException", "alert('" + ex.Message + "');", true);
      }
  }

Updatemode for updatepanel是有条件的。

单击按钮时异步填充gridview

问题可能是您在非ui线程上调用DataBind()Update()。UI控件只能在创建它们的线程上修改。

你仍然可以在一个单独的线程中调用你的GetData()方法,例如使用Tasks.

在你的btnSearch_Click方法中:

Task.Factory
    .StartNew(() => GetData())
    .ContinueWith(t => 
    {
        gvShowResult.DataSource = t.Result; 
        gvShowResult.DataBind();
        UpdatePanel2.Update();
    }, TaskScheduler.FromCurrentSynchronizationContext());

在一个单独的线程上调用GetData(),并在UI线程上执行延续。

我认为你的代码有很多问题。首先,您没有让asp.net知道您想要将异步方法作为请求的一部分执行。在你的代码中,请求在调用bd.BeginInvoke()之后返回,而不是在对BindGrid的异步调用完成之后返回。

第二个问题是,当您异步调用BindGrid()方法时,代码中没有异步I/O,因此在检索数据时不会释放任何asp.net线程。您只是延迟了对BindGrid()的调用。这篇文章应该能帮助你解决上述问题。

如果使用。net 4.5是一个选项,你应该尝试使用async和await对创建异步行为。查看这篇解释如何在asp.net MVC中做到这一点的文章。