確定子執行緒建立無誤,編譯也通過了。但是,執行時卻出現了這樣的錯誤:
原來,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;
}
}
}
}