winform跨线程访问控件

Posted asdyzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 + " ");
            }
        }
//这个就是要开启线程的方法  如果要操作控件,必须调用上面的方法
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是具体操作的逻辑。就是这么简单

 

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

以上是关于winform跨线程访问控件的主要内容,如果未能解决你的问题,请参考以下文章

C#WinForm解决跨线程访问控件属性报错

winform跨线程访问控件

实现Winform 跨线程安全访问UI控件

不是创建控件的线程访问它-WinForm如何跨线程访问控件

winform 跨线程访问控件

winform的窗体控件可以用线程直接调用吗