多執行緒操作UI控制元件——DataGridView假死現象
阿新 • • 發佈:2019-01-26
在多執行緒程式設計中,如果你從非建立這個控制元件的執行緒中訪問這個控制元件或者操作這個控制元件的話就會丟擲這個異常。這是微軟為了保證執行緒安全以及提高程式碼的效率所做的改進,但是也
給大家帶來很多不便。
今天我就遇到了一個類似的問題,對DataGridView指定 DataSource 來填充資料,更新資料的時候,會導致DataGridView出現假死,顯示錯誤或者滾動條無法顯示的問題,在保證了DataGridView的ScrollBars設定為了Both,資料量大於DataGridView顯示的的範圍,而且沒有凍結列的情況下,解決方法有兩種:
第一種是通過設定
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程式初始化的時候設定了這個屬性,而且在你的控制元件中使用的都是微軟Framework類庫中的控制元件的話,程式就不會再出現錯誤資訊了,但是這種辦法不能從根本是解決問題,而且本人親測貌似只能解決了程式報錯問題,在DataGridView資料能正常顯示,但不能拖動滾動條,即假死現象沒有得到根本解決(個人現象,有待深入考究)。
第二種就是用委託
在子執行緒中,把給控制元件賦值委託個主執行緒來實現。程式碼如下:
主執行緒定義委託
#region datagrideview資料繫結委託
private delegate void InvokeHandler();
#endregion
在子執行緒中呼叫
this.Invoke(new InvokeHandler(delegate()
{
this.dataGrid.DataSource = dt2;
}));
效果圖: