using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 跨线程访问 {//跨线程指访问 public partial class Form1 : Form { private delegate void setTextValueCallBack(int x); setTextValueCallBack setCallBack;//先定义委托类型变量。 public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { setCallBack = setTextValue;//给委托变量赋值一个方法 Thread th = new Thread(textBox);//执行textBox方法 th.IsBackground=true;//设置为后台线程。 th.Start(); } private void textBox() { for (int i = 0; i < 10000; i++)//textBox1的数值累加到9999 { //setCallBack指向的是setTextValue方法。 textBox1.Invoke(setCallBack,i);//访问textBox1用Invoke方法 } } private void setTextValue(int value) { textBox1.Text = value.ToString(); } } }
TextBox1 的值循环在线程中累加到9999,运行结果。
补充:
简化写法:
private void button1_Click(object sender, EventArgs e) { Thread th = new Thread(testMethod);//创建一个线程执行testMethod方法 th.IsBackground = true;//设置为后台线程 th.Start();//开启线程 } void testMethod() { for (int i = 0; i < 10000; i++) { textBox1.Invoke(new Action<int>(n=>{ textBox1.Text = n.ToString();}),i);//lambda表达试写法 } }