確定子線程創建無誤,編譯也通過了。但是,運行時卻出現了這樣的錯誤:
原來,C#中是不支持跨線程操控控件的。不過,出於安全考慮,這樣做也是合情合理,這樣可以避免多個線程同時操控一個控件所帶來的程序運行錯誤。那麼,如何來實現這樣的效果呢?
方法一:將 Control.CheckForIllegalCrossThreadCalls 屬性設置為 false。你可以嘗試給窗體添加Form_Load()事件,然後在事件函數體中對這個屬性進行設置。
編譯就會發現,程序已經可以順利執行了。這個方法比較簡單,但始終不太安全。所以我們不推薦這樣的用法。
方法二:用委托來實現
using System.Threading;
namespace MulTrdDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定義委托類型
public delegate void TreadDelgate();
//初始化子線程對象
private Thread demoThread = null;
private void button1_Click(object sender, EventArgs e)
{
demoThread = new Thread(new ThreadStart(ThreadProcUnsafe));
demoThread.Start();
}
public void ThreadProcUnsafe()
{
SetText();
}
private void SetText()
{
string text = "這個控件的內容是由子線程實現的";
if (this.textBox1.InvokeRequired)
{
TreadDelgate Objdelegate = new TreadDelgate(SetText);
this.Invoke(Objdelegate, new object[] {});
}
else
{
this.textBox1.Text = text;
}
}
}
}