1. 程式人生 > >WinForm跨線程訪問控件異常

WinForm跨線程訪問控件異常

通過 pda -m 需求 做了 private ima task sender

WinForm跨線程訪問控件異常

最近做了個WinForm的小項目,遇到個簡單的問題記錄下。需求:點擊”下載“,顯示正在下載,下載完後更新狀態為”ready“(要求用多線程,避免前臺卡死)。

做法

新建一個線程,在新線程中下在更新控件狀態,報異常跨線程程訪問控件(當然可以通過關閉跨線程訪問控件檢驗解決,不鼓勵這麽做)。應該C#5.0版本添加的任務Task異步,這裏用異步解決。

Code

  1. 新建WinForm 項目,Form1添加控件如圖
    技術分享圖片

  2. 後臺代碼

    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跨線程訪問控件異常