从一个线程中操作另一个线程的控件

      写C/S程序的时候经常遇到一个线程中操作另一个线程的控件,比如当收到消息的时候在RICHTEXTBOX增加内容。在不同的测试环境下,可能产生不同的异常,我用vs2003的时候,没有什么提示,就是操作不是每次都成功,在vs2005下会引发一个异常[有些朋友的VS2003也会],提示“从不是创建控件的线程访问它”。这跟现实中的一些例子是一样的,例如取款机,如果你不是银行的负责人,只能用卡,如果你去开锁,那么一会警察就来了。那怎么在一个线程中操作另一个线程的控件呢?
      比较常用的就是使用委托(delegate)来完成,不知道委托的可以搜索C#睡前故事,如: http://www.google.com/search?q=C%23%E7%9D%A1%E5%89%8D%E6%95%85%E4%BA%8B&hl=zh-CN&newwindow=1&lr=lang_zh-CN%7Clang_zh-TW&nxpt=20.640385052413339671421  ,VS2005 WINFORM 控件都有了一个 InvokeRequired 属性,如果属性为true 说明其他线程正在操作该控件,这时就要创建一个委托实例,然后调用控件对象的 Invoke 方法,保证其他现成可以安全操作本线程中的控件。例如
    
None.gif delegate  void  AppendStrDg( string  str);
ExpandedBlockStart.gifContractedBlock.gif    
private   void  AppendStr( string  str) dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(RichTextBox1.InvokeRequired)dot.gif{
InBlock.gif          AppendStrDg  dg 
= new AppendStrDg(AppendStr);
InBlock.gif          RichTextBox1.Invoke(dg,
"user->:Hello World!");
ExpandedSubBlockStart.gifContractedSubBlock.gif       }
 elsedot.gif{
InBlock.gif          RichTextBox1.Text 
+= str;
ExpandedSubBlockEnd.gif       }

ExpandedBlockEnd.gif   }
   
None.gif
       其实我们不用判断也知道该控件是哪个线程创建的,因为程序是你自己写的,当然清楚是UI线程创建的还是其他方法创建的。

转载于:https://www.cnblogs.com/asboy/archive/2007/05/05/delegate.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值