網友問題,這裡大概簡單實作並記錄。 一般初期大家都以單執行緒為主,但後期需求變多或要處理大量耗時作業 單一執行緒幾乎無法滿足我們的需求,而且還會被使用者抱怨程式用起來很卡或無回應(看個人造化!遇到好user算祖上積德XD)。 遇到這樣的狀況,大多使用者都會強制關閉程式(UI執行緒在沒把主控權交還給Windows前是凍結的) 使用單一執行緒幾乎都躲不了這樣的宿命,所以就得靠多執行緒來改善這樣的問題。 行為:執行大量新增作業(100000筆資料) 初始畫面
03 | private void Form1_Load( object sender, EventArgs e) |
06 | ThreadPool.SetMinThreads(2, 5); |
07 | ThreadPool.SetMaxThreads(4, 10); |
11 | private void InitData() |
13 | dt = new DataTable( "table1" ); |
16 | Random rnd = new Random(); |
17 | for (Int32 i = 1; i <= 10; i++) |
19 | DataRow row = dt.NewRow(); |
20 | row[ "c1" ] = rnd.Next(1, 100); |
21 | row[ "c2" ] = "i_am_c2" ; |
24 | dataGridView1.DataSource = dt; |
單一執行緒(新增資料) 01 | private void button1_Click( object sender, EventArgs e) |
06 | //將job丟入ThreadPool Queue |
08 | //ThreadPool.QueueUserWorkItem(new WaitCallback(AddRow)); |
15 | for (Int32 i = 1; i <= 100000; i++) |
17 | DataRow dr = dt.NewRow(); |
18 | dr[ "c1" ] = i.ToString(); |
21 | label1.Text = "總共筆數:" + dt.Rows.Count.ToString(); |
24 | dataGridView1.FirstDisplayedScrollingRowIndex = dt.Rows.Count; |
執行畫面果然完全凍結,而且畫面也無法重畫(一片白),這時任誰都會想按下ctrl+alt+del。 使用ThreadPool來改善 01 | private void button1_Click( object sender, EventArgs e) |
06 | //將job丟入ThreadPool Queue |
08 | ThreadPool.QueueUserWorkItem( new WaitCallback(AddRow)); |
12 | delegate void MyInvoke(String status); |
13 | private void UpdateLab(String status) |
18 | delegate void MyInvoke2(Int32 index); |
19 | private void DisplayDataGridView(Int32 index) |
21 | dataGridView1.FirstDisplayedScrollingRowIndex = index; |
24 | private void AddRow( object arg) |
28 | for (Int32 i = 1; i <= 100000; i++) |
30 | DataRow dr = dt.NewRow(); |
31 | dr[ "c1" ] = i.ToString(); |
34 | MyInvoke mi = new MyInvoke(UpdateLab); |
36 | Invoke(mi, "總共筆數:" + dt.Rows.Count.ToString()); |
40 | MyInvoke2 mi2 = new MyInvoke2(DisplayDataGridView); |
使用ThreadPool後,UI終於可隨意拖拉,UI裡的物件也可即時重畫,在也不會發生無回應或很卡的狀況了。
DotBlogs Tags:
C#
WinForm
關連文章
[C#][Tips]迴圈中別建立執行個體
[C#][WinForm]擺脫密碼透視小工具
[C#][Tips]比較Int32.TryParse、Int32.Parse And Convert.ToInt32
[C#][WinForm]如何合併圖片
|