跳到主要內容

[C#] 如何在多執行緒(Multi-Thread)環境中,跨執行緒存取UI控制項

此篇文章主要簡述如何在多執行緒(Multi-Thread)環境中,跨執行緒存取UI控制項
以此避免多執行緒在存取UI控制項會發生"跨執行緒作業無效: 存取控制項 'XXXX' 時所使用的執行緒與建立控制項的執行緒不同"




Source file
01 //1. 先宣告delegate function - 要跟委派的function signature一致
02 private delegate void AssignDataTableToGrid(DataTable lsDataTable);
03 
04 //2. 在需要的sub新建執行緒
05         private void btnQueryHistory_Click(object sender, EventArgs e)
06         {
07             Thread thrTest = new Thread(NewMethod);
08             thrTest.Start();
09          
10         }
11 
12 // 3. 在主function中,使用delegate並使用invoke
13         private void NewMethod()
14         {
15             DataRow lsRow;
16             DataTable lsTable = new DataTable();
17             List<VSSUtil.LabelInfo> lsResult;
18          
19             try
20             {
21                 if (txtQuerySelectProject.Text == "")
22                     return;
23 
24                 MakeHeaders(lsTable, _GRID_VERSION_HISTORY_COLS);
25                 //lsResult = myVSSUtil.getLabels(txtQuerySelectProject.Text);
26                 lsResult = myVSSUtil.getHistory(txtQuerySelectProject.Text);
27 
28                 foreach (VSSUtil.LabelInfo info in lsResult)
29                 {
30                     lsRow = lsTable.NewRow();
31                     lsRow[_COL_HISTORY_ACTION] = info.action;
32                     lsRow[_COL_HISTORY_DATE] = info.date;
33                     lsRow[_COL_HISTORY_FILENAME] = info.filename;
34                     lsRow[_COL_HISTORY_LABEL] = info.lable;
35                     lsRow[_COL_HISTORY_LABELCOMMENT] = info.lablecomment;
36                     lsRow[_COL_HISTORY_USERNAME] = info.username;
37                     lsRow[_COL_HISTORY_VERSION] = info.version;
38 
39                     lsTable.Rows.Add(lsRow);
40                 }
41              
42                 AssignDataTableToGrid deleTest = new AssignDataTableToGrid(AssignData);
43                 this.Invoke(deleTest,new object[] { lsTable });
44                              
45                 return;
46             }
47             catch (Exception ex)
48             {
49                 MessageBox.Show(ex.ToString());
50             }
51         }
52 
53 // 4. delegate function實作
54         private void AssignData(DataTable lsTable)
55         {
56             gridProjectHisory.DataSource = lsTable;
57         }
以此方式改寫原來的single thread ap,立馬提升UI friendly程度
張貼留言

這個網誌中的熱門文章

[遊記] 20160710 廈門 - 中山路步行街,鼓浪嶼

此次趁出差之便,於周末從廈門翔安區到島內搭船到鼓浪嶼來看看這素有海上花園之稱的地方


[遊記] 20160702 廈門 - 廈門大學、南普陀寺、SM城市廣場

工作這麼久還是第一次出差
問了別人周末要到哪邊,都先推先到廈門大學來看看