WinForm跨線程訪問控件異常
阿新 • • 發佈:2017-12-27
通過 pda -m 需求 做了 private ima task sender
WinForm跨線程訪問控件異常
最近做了個WinForm的小項目,遇到個簡單的問題記錄下。需求:點擊”下載“,顯示正在下載,下載完後更新狀態為”ready“(要求用多線程,避免前臺卡死)。
做法
新建一個線程,在新線程中下在更新控件狀態,報異常跨線程程訪問控件(當然可以通過關閉跨線程訪問控件檢驗解決,不鼓勵這麽做)。應該C#5.0版本添加的任務Task
異步,這裏用異步解決。
Code
新建WinForm 項目,Form1添加控件如圖
後臺代碼
private void button1_Click(object sender, EventArgs e) { UpdateStatus(); } private void button2_Click(object sender, EventArgs e) { UpdateStatusThread(); } //運行會報異常 private void UpdateStatusThread() { Thread th = new Thread(() => { string status = "ready"; Thread.Sleep(3000); lbStatus.Text = status; }); th.Start(); } private void UpdateStatus() { new TaskFactory().StartNew(() => { string status = "ready"; Thread.Sleep(3000); //將更新控件操作放在其內 this.Invoke(new Action(() => { lbStatus.Text = status; })); }); }
WinForm跨線程訪問控件異常