当前位置:编程学习 > C#/ASP.NET >>

c# 界面异步加载

有2个窗体Form1和Form2

form1上有个按钮点击之后show出来form2
现在问题来了....form2上有10几个textbox
在form2 的Load 的时候读取数据赋值到这个十几个textbox上显示。
可以由于网络延迟、数据量大、计算耗时(因为读出数据来还要有各种运算,挺耗时)等等原因,
导致form2 要等好几秒才能显示出来,体验非常差...
求异步解决方案,先显示出来界面,数据在异步加载到textbox上.....(难道要对每个控件进行委托处理?)


--------------------编程问答-------------------- 把赋值写在form2的Shown事件里,这样界面会先出现 --------------------编程问答--------------------
引用 1 楼 intraweb 的回复:
把赋值写在form2的Shown事件里,这样界面会先出现

纳尼??? --------------------编程问答--------------------
引用 2 楼 wangjun8868 的回复:
Quote: 引用 1 楼 intraweb 的回复:

把赋值写在form2的Shown事件里,这样界面会先出现

纳尼???


放在线程中就可以了 --------------------编程问答--------------------
引用 楼主 wangjun8868 的回复:
form1上有个按钮点击之后show出来form2
现在问题来了....form2上有10几个textbox
在form2 的Load 的时候读取数据赋值到这个十几个textbox上显示。
可以由于网络延迟、数据量大、计算耗时(因为读出数据来还要有各种运算,挺耗时)等等原因,
导........


比如说原来是
void Form_Load(object sender, EventArgs e)
{
    abc();
}

那么你可以改为
void Form_Load(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(h=> abc());
}


这就可以异步处理了。

当然,你的在计算完毕显示时,需要使用
this.BeginInvoke(...)
来处理一下。 --------------------编程问答-------------------- 不需要“对每个控件”处理,你在计算完毕,可以一次性异步显示。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 3 楼 happy09li 的回复:
Quote: 引用 2 楼 wangjun8868 的回复:

Quote: 引用 1 楼 intraweb 的回复:

把赋值写在form2的Shown事件里,这样界面会先出现

纳尼???


放在线程中就可以了

举个列子 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
Quote: 引用 楼主 wangjun8868 的回复:

form1上有个按钮点击之后show出来form2
现在问题来了....form2上有10几个textbox
在form2 的Load 的时候读取数据赋值到这个十几个textbox上显示。
可以由于网络延迟、数据量大、计算耗时(因为读出数据来还要有各种运算,挺耗时)等等原因,
导........


比如说原来是
void Form_Load(object sender, EventArgs e)
{
    abc();
}

那么你可以改为
void Form_Load(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(h=> abc());
}


这就可以异步处理了。

当然,你的在计算完毕显示时,需要使用
this.BeginInvoke(...)
来处理一下。


顶这位大神级的回复 --------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
不需要“对每个控件”处理,你在计算完毕,可以一次性异步显示。

this.BeginInvoke(...) 还不是要一个个写? --------------------编程问答--------------------
引用 9 楼 wangjun8868 的回复:
Quote: 引用 5 楼 sp1234 的回复:

不需要“对每个控件”处理,你在计算完毕,可以一次性异步显示。

this.BeginInvoke(...) 还不是要一个个写?


数据出来后,把赋值的都放在beginInvoke里面。 --------------------编程问答-------------------- 这些数据返回的速度有快有慢吧?
出来一个刷一个效果就好些,我的想法是封装一个委托方法,传进来的是textbox对象,这样代码就少一些,当然还是要对每个控件进行委托显示。 --------------------编程问答--------------------
引用 10 楼 yyantifa 的回复:
Quote: 引用 9 楼 wangjun8868 的回复:

Quote: 引用 5 楼 sp1234 的回复:

不需要“对每个控件”处理,你在计算完毕,可以一次性异步显示。

this.BeginInvoke(...) 还不是要一个个写?


数据出来后,把赋值的都放在beginInvoke里面。

给点提示吧,写点代码看看! --------------------编程问答--------------------
引用 12 楼 wangjun8868 的回复:
Quote: 引用 10 楼 yyantifa 的回复:

Quote: 引用 9 楼 wangjun8868 的回复:

Quote: 引用 5 楼 sp1234 的回复:

不需要“对每个控件”处理,你在计算完毕,可以一次性异步显示。

this.BeginInvoke(...) 还不是要一个个写?


数据出来后,把赋值的都放在beginInvoke里面。

给点提示吧,写点代码看看!


如果与服务器只需要交互一次就可以得到数据。比如DataSet一个集合。
可以这样:

            ThreadPool.QueueUserWorkItem(item =>
            {
                DataSet dsInfo = GetDB();//GetDB获取数据
                this.BeginInvoke(new Action(() =>
                {
                    textBox1.Text = dsInfo.Tables[0].Rows[0]["Col1"].ToString();
                    textBox2.Text = dsInfo.Tables[0].Rows[0]["Col2"].ToString();
                }));
            });
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,