WinForm 控制項具有執行緒親和性,非建立執行緒呼叫需透過 Invoke/BeginInvoke 封送。
public partial class Form1 : Form {
Thread[] workThreads = new Thread[10];
public Form1() { InitializeComponent(); }
delegate void AddItemCallback(string text);
private void AddItem(string text) {
if (this.listBox1.InvokeRequired) {
AddItemCallback d = new AddItemCallback(AddItem);
this.Invoke(d, new object[] { text });
}
else {
this.listBox1.Items.Add(text);
}
}
public void DataGet() {
while (true) {
AddItem("ok");
Thread.Sleep(1000);
}
}
private void button1_Click(object sender, EventArgs e) {
for (int i = 0; i < workThreads.Length; i++) {
if (workThreads[i] == null) {
workThreads[i] = new Thread(new ThreadStart(DataGet));
workThreads[i].Name = i.ToString();
workThreads[i].Start();
}
else if (workThreads[i].ThreadState == ThreadState.Aborted || workThreads[i].ThreadState == ThreadState.Stopped) {
workThreads[i] = new Thread(new ThreadStart(DataGet));
workThreads[i].Name = i.ToString();
workThreads[i].Start();
}
else {
workThreads[i].Start();
}
}
}
private void button2_Click(object sender, EventArgs e) {
for (int i = 0; i < workThreads.Length; i++) {
if (workThreads[i] != null && workThreads[i].ThreadState != ThreadState.Stopped && workThreads[i].ThreadState != ThreadState.Aborted) {
workThreads[i].Abort();
}
}
}
}
InvokeRequired 檢查是否需封送。AddItemCallback 封裝 UI 更新邏輯。Invoke 同步封送,確保執行緒安全。原始碼下載:多執行緒與 WinForm 互動範例