Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击按钮时异步填充gridview_C#_Asp.net_Asynchronous - Fatal编程技术网

C# 单击按钮时异步填充gridview

C# 单击按钮时异步填充gridview,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我想填充一个Gridview,它位于按钮单击时的更新面板内。目前,gridview正在填充,但是屏幕上没有显示。我错过了什么? 下面是我正在使用的代码: public delegate void BindGrid_Delegate(); protected void btnSearch_Click(object sender, EventArgs e) { try { // databind of all the control

我想填充一个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是有条件的。非常感谢您的帮助。

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

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

btn搜索中,单击
方法:

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

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

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

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


如果可以选择使用.Net 4.5,则应尝试使用async和Wait对创建异步行为。检查该选项,了解如何在ASP.Net MVC中执行此操作。

为什么不在BTN搜索中直接调用BindGrid()?你应该删除委托和IAsyncResult,因为这不会帮助你跑得更好。嘿,蒂姆,是的,如果我直接给比丁格里德打电话,它就像一个符咒。不过,我想使用异步调用,因为我正在尝试学习它。嘿,Dirk,名称空间任务属于哪个。我只得到Microsoft.Office.Interop.Word.Task作为可用的命名空间。@Garginara在和@Dirk的文档中,问题是关于ASP.Net的,其中没有UI线程。您可能是在考虑Windows应用程序的情况下创建了您的答案。@Floridumitrescu是的,在阅读您的答案后,我意识到了这一点。我错过了ASP.Net标签,问题/代码看起来像windows窗体。谢谢Florin,让我浏览这些文章,我会给你回复的。