C#多线程窗体控件安全访问

 C# 2.0 为了线程安全,不充许子线程直接访问窗体中的控件
如果在子线程中直接访问说窗体控件,编译器会提示,控件不是
由该线程创建的.


那么在子线程中如何访问窗体中的控件呢?
在窗体的构造函数中加入这一句
Control.CheckForIllegalCrossThreadCalls = false;
子线程就可以直接访问窗体中的控件了,不过这样线程是非安全的.
而默认Control.CheckForIllegalCrossThreadCalls=true;(捕获线程错误调用)
这时可以用Invoke
 

如下:

 
  
  
  
  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using System.Threading;  
  9.  
  10. namespace Project2  
  11. {  
  12.      
  13.  
  14.     public partial class Form1 : Form  
  15.     {  
  16.         private BackgroundWorker backgroundWorker1;  
  17.  
  18.         protected delegate void UpdateControlText(string strText); //定义一个委托  
  19.  
  20.         //定义更新控件的方法  
  21.         protected void updateControlText(string strText)  
  22.         {  
  23.            this.label1.Text  = strText ;  
  24.             return;  
  25.         }  
  26.  
  27.  
  28.         public Form1()  
  29.         {  
  30.            InitializeComponent();  
  31.         }  
  32.  
  33.  
  34.         private void button1_Click(object sender, EventArgs e)  
  35.         {  
  36.             Thread ff = new Thread( new ThreadStart (x1));  
  37.             ff.Start();  
  38.         }  
  39.  
  40.         private void x1()//线程安全的访问窗体控件  
  41.         {  
  42.             for (int i = 0; i < 1000; i++)  
  43.             {  
  44.                 long xx = Convert.ToInt32(this.label1.Text);  
  45.                 if (this.InvokeRequired)  
  46.                 {  
  47.     //用更新控件的方法updateControlText实例化一个委托update  
  48.                     UpdateControlText update = new UpdateControlText(updateControlText);  
  49.                     this.Invoke(update, Convert.ToString(++xx));  //调用窗体Invoke方法  
  50.                 }  
  51.                 else 
  52.                 {  
  53.                     this.label1.Text = Convert.ToString(++xx);  
  54.                 }  
  55.             }  
  56.         }  
  57.      }  
  58.  } 

你可能感兴趣的:(多线程,C#,职场,休闲,安全访问)