按钮单击时异步填充gridview

时间:2013-05-13 07:37:31

标签: c# asp.net asynchronous

我想在按钮点击时填充更新面板内的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);
      }
  }

updatepanel的Updatemode是有条件的。我很感激任何帮助。

2 个答案:

答案 0 :(得分:0)

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

您仍然可以在单独的帖子中调用GetData()方法,例如使用Tasks

btnSearch_Click方法中:

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

在单独的线程上调用GetData()并在UI线程上执行continuation。

答案 1 :(得分:0)

我认为您的代码存在多个问题。首先,您不要让ASP .Net知道您希望在请求中执行异步方法。在您的代码中,请求在调用bd.BeginInvoke()之后返回,而在完成对BindGrid的异步调用之后它应该返回。

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

如果使用.Net 4.5是一个选项,则应尝试使用async和await对创建异步行为。检查this article,解释如何在ASP .Net MVC中执行此操作。