我想在按钮点击时填充更新面板内的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是有条件的。我很感激任何帮助。
答案 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中执行此操作。