winform跨线程访问控件

首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。所以除了控件所在的线程外的线程调用会抛异常

(Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on .)

下面进入正题:

  第一种方法:

    

1
2
3
4
5
6
public  DomainQuery2()
        {
 
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =  false ; //设置该属性 为false
        }

  这种方法很方便,但是会有安全问题。

 

  第二种方法:

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private  delegate  void  FlushClient( string  a);  //代理委托
//代理赋值方法
private  void  TextboxFZ3( string  str)
         {
             if  ( this .textBox3.InvokeRequired)
             {
                 FlushClient fc =  new  FlushClient(TextboxFZ3);
                 this .Invoke(fc, str);  //通过代理调用刷新方法
             }
             else
             {
                 this .textBox3.AppendText(str +  "\r\n" );
             }
         }
//这个就是要开启线程的方法  如果要操作控件,必须调用上面的方法
private  void  FZ( object  obj)  
{
       TextboxFZ3(obj);
}
//点击执行
private  void  button1_Click( object  sender, EventArgs e)
{
      Thread thread =  new  Thread( new  ParameterizedThreadStart(SerchInfo));
             thread.IsBackground =  true ;
             thread.Start(“我是子线程操作的控件赋值”);
}

    我喜欢先上代码然后解释,第一句:代理委托,当要操作控件的时候做一个判断,如果是子线程要操作,就使用代理委托操作(这里不理解就在赋值方法那里打个断点调试),FZ是具体操作的逻辑。就是这么简单

 

这两种方法我比较赞同第二种,虽然比第一种方法的代码多,但是相对来说安全性也是有的。

转载于:https://www.cnblogs.com/asdyzh/p/9876863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值