C#中的跨线程调用

【菜科解读】
代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;//添加线程的命名空间namespace ppp{public partial class Form1 : Form{public Form1(){InitializeComponent();}Thread t; //定义线程变量private void button1_Click(object sender, EventArgs e){t = new Thread(new ThreadStart(Threadp)); //实例化线程t.Start();//启动线程}自定义方法Threadp,主要用于线程的调用。
代码如下:public void Threadp(){textBox1.Text = "实现在子线程中操作主线程中的控件";t.Abort();//关闭线程}}图1 在子线程中操作主线程中控件的错误提示信息:以上是通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它。
那么,如何解决跨线程调用Windows窗体控件呢?可以用线程委托实现跨线程调用Windows窗体控件。
下面将上一个例子进行一下改动。
代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;//添加线程的命名空间namespace ppp{public partial class Form1 : Form{public Form1(){InitializeComponent();}Thread t; //定义线程变量private void button1_Click(object sender, EventArgs e){t = new Thread(new ThreadStart(Threadp)); //实例化线程t.Start();//启动线程}private delegate void setText();//定义一个线程委托自定义方法Threadp,主要用于线程的调用。
代码如下:public void Threadp(){setText d = new setText(Threading); //实例化一个委托this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托}自定义方法Threading,主要作于委托的调用。
代码如下:public void Threading(){textBox1.Text = "实现在子线程中操作主线程中的控件";t.Abort();//关闭线程}}} 中的,跨,线程,调用,在,开发,具有,线程,的,