单击按钮时异步填充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是有条件的。
问题可能是您在非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中做到这一点的文章。