因為寫的程式涉及到多線程維護一個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的裡面形式都差不多,就是參數應該不太一樣吧~