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,主要用于線程的調(diào)用。代碼如下:
public void Threadp()
{
textBox1.Text = "實現(xiàn)在子線程中操作主線程中的控件";
t.Abort();//關(guān)閉線程
}
}
圖1 在子線程中操作主線程中控件的錯誤提示信息:
以上是通過一個子線程來操作主線程中的控件,但是,這樣作會出現(xiàn)一個問題(如圖1所示),就是TextBox控件是在主線程中創(chuàng)建的,在子線程中并沒有對其進行創(chuàng)建,也就是從不是創(chuàng)建控件的線程訪問它。那么,如何解決跨線程調(diào)用Windows窗體控件呢?可以用線程委托實現(xiàn)跨線程調(diào)用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,主要用于線程的調(diào)用。代碼如下:
public void Threadp()
{
setText d = new setText(Threading); //實例化一個委托
this.Invoke(d); //在擁用此控件的基礎(chǔ)窗體句柄的線程上執(zhí)行指定的委托
}
自定義方法Threading,主要作于委托的調(diào)用。代碼如下:
public void Threading()
{
textBox1.Text = "實現(xiàn)在子線程中操作主線程中的控件";
t.Abort();//關(guān)閉線程
}
}
}