將 Sleep 與無限迴圈移至等待非同步的外層,透過 InvokeRequired 判斷是否需跨執行緒呼叫:
public partial class Form1 : Form {
private delegate void FlushClient();
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
Thread thread = new Thread(CrossThreadFlush);
thread.IsBackground = true;
thread.Start();
}
private void CrossThreadFlush() {
while (true) {
Thread.Sleep(1000); // 外層睡眠
ThreadFunction();
}
}
private void ThreadFunction() {
if (this.textBox1.InvokeRequired) {
FlushClient fc = new FlushClient(ThreadFunction);
this.Invoke(fc); // 透過委派非同步封送回 UI 執行緒
} else {
this.textBox1.Text = DateTime.Now.ToString();
}
}
}
執行結果:問題解決。InvokeRequired 確保不持續佔用主執行緒,避免跨執行緒異常,同時保持 UI 回應。