在界面的子线程中操作界面控件

     通常,会有这样的需求与问题:运行了一个窗体,触发某个事件后需要做一些处理,而这个处理可能比较耗时间或者耗资源,如果直接在消息响应中处理,运行起来界面会假死。这个时候,我们想到了多线程,新建一个子线程来处理这个过程,然后将处理的结果告诉界面线程,并在界面上体现出来给用户看。这样就出现了一个问题,子线程显示结果给用户时,需要操纵界面线程管理的控件,而当子线程没有释放这个控制时,控件也会出现假死,因为界面线程不能及时绘制控件了。

 

     处理方法:使用委托,将子线程操作控件的部分委托给界面线程去做。

 

例子

 

通常的实现如下: 

 

代码
 
   
1 private void queryButton_Click( object sender, EventArgs e)
2 {
3
4 Thread queryThread = new Thread( new ThreadStart(query));
5
6 queryThread.start();
7
8 }
9
10   private void query()
11 {
12
13 queryTextbox.text = " queryThread result " ;
14
15 }

 

 

 

修正:

 

代码
 
   
1 // 1.增加一个
2   delegate void queryFunDelegate();
3
4   // 2.新加一个函数
5 private void sinvoke()
6
7 {
8
9 this .Invoke( new queryFunDelegate(query));
10
11 }
12
13 // 3.之后重新调用
14 private void queryButton_Click( object sender, EventArgs e)
15
16 {
17
18 Thread queryThread = new Thread( new ThreadStart(sinvoke);
19
20 queryThread.start();
21
22 }
23
24 // 4.处理函数
25 private void query()
26 {
27
28 queryTextbox.text = " queryThread result " ;
29
30 }

 

转载于:https://www.cnblogs.com/njucslzh/archive/2010/11/06/1870401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值