C# 单击按钮时异步填充gridview
我想填充一个Gridview,它位于按钮单击时的更新面板内。目前,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
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,让我浏览这些文章,我会给你回复的。