c#中多線程寫DataGridView出現滾動條導致程序卡死(無響應)的解決辦法

因爲寫的程序涉及到多線程維護一個DataGridView,然後蛋疼的發現經常卡死。。。一開始以爲是讀寫衝突的原因,然後就加了鎖,問題依舊。。。然後發現每次出現滾動條的時候程序纔會無響應,所以感覺應該是滾動條出現問題。。。

網上說用Invoke就可以解決問題,試了一下,可能是我使用的方法不對,還是沒有解決問題-_-||

最後使用InvokeRequired解決的。。。

因爲我的修改DataGridView的代碼是寫在窗體裏面的,so。。。

        private static object obj = new object();
        private delegate void ChangeFunction(PackageMessage pm, string Message);
        public void AddWarning(PackageMessage pm, string Message)
        {
            if (dgv.InvokeRequired)
            {
                ChangeFunction c = new ChangeFunction(AddWarning);
                this.Invoke(c, new object[] { pm, Message });
            }
            else
            {
                lock (obj)
                {
                    DataRow dr = MessageDT.NewRow();
                    dr[0] = pm.GetSendTime().ToString();
                    dr[1] = pm.GetSourceIP().ToString() + ":" + pm.GetSourcePort().ToString();
                    dr[2] = pm.GetDestinaionIP().ToString() + ":" + pm.GetDestinationPort().ToString();
                    dr[3] = Message;
                    MessageDT.Rows.Add(dr);
                }
            }
        }

說明一下 dgv是一個DataGridView的對象,一開始以爲綁定一個DataTable dt會好些,結果發現沒用。。。然後也沒刪-_-||

加InvokeRequired就行了,lock的那個沒加貌似也沒出問題,但是爲了安全起見我就加上了。。。

在else裏面,或者是在lock裏面(如果你加鎖的話)寫功能代碼,if的裏面形式都差不多,就是參數應該不太一樣吧~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章