WinForms 中,文本框回車鍵觸發打印功能導致 UI 卡死,加 Thread.Sleep(3000) 反而正常。本文分析原因並給出多線程解決方案。
Thread.Sleep(3000) → 正常(但太慢)打印操作(特別是涉及打印機驅動、緩衝區交互)耗時較長,且在 UI 線程同步執行時會阻塞消息泵,導致界面無法重繪、無法響應用戶操作。Sleep 只是偶然讓打印後台線程搶到時間片完成初始化,非根治。
private void txtInput_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Enter) {
e.Handled = true;
// 關鍵:將耗時打印操作放入後台線程
Task.Run(() => {
PrintDocument(); // 具體打印邏輯
});
// 或使用 BackgroundWorker / Thread
}
}
void PrintDocument() {
// 打印邏輯:創建 PrintDocument、設置 PrintPage 事件、調用 Print()
// 注意:若需更新 UI 進度,請用 Invoke/BeginInvoke 回主線程
}
Invoke 顯示錯誤提示UI 線程只負責交互,耗時操作(打印、IO、計算、網絡)必須異步化,是 WinForms/WPF 開發的鐵律。