天天看點

C# 多線程的實作

首先,上個多線程的概念。通過單獨的線程來執行某個任務,一個多線程程式可以執行多個任務,而且這些線程都是并行執行,同時執行多個線程的能力稱為多線程。

根據多線程的概念,我們知道,多線程可以提高程式的運作效率,加快運作的速度。比較典型的應用就是我們經常使用的下載下傳工具,就用到了多線程技術。

下面上一段代碼,看一下C#中如何實作多線程。

我們在控制台項目中,鍵入如下代碼:

Main函數中定義了3個線程的線程數組,然後循環調用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>

<code>{</code>

<code>    </code><code>TestThread testThread = </code><code>new</code> <code>TestThread();</code>

<code>    </code><code>Thread[] test = </code><code>new</code> <code>Thread[]</code>

<code>    </code><code>{</code>

<code>        </code><code>new</code> <code>Thread(</code><code>new</code> <code>ThreadStart(testThread.ActionMethod)),</code>

<code>        </code><code>new</code> <code>Thread(</code><code>new</code> <code>ThreadStart(testThread.ActionMethod))</code>

<code>    </code><code>};</code>

<code>    </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; test.Length; i++)</code>

<code>        </code><code>test[i].Name = </code><code>"子線程"</code> <code>+ i;</code>

<code>        </code><code>test[i].Start();</code>

<code>    </code><code>}</code>

<code>}</code>

這是一個普通的方法,用于測試線程的執行情況。

<code>public</code> <code>class</code> <code>TestThread</code>

<code>    </code><code>public</code> <code>void</code> <code>ActionMethod()</code>

<code>        </code><code>//lock (this)</code>

<code>        </code><code>{</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; 5; i++)</code>

<code>            </code><code>{</code>

<code>                </code><code>Console.WriteLine(</code><code>"線程名:"</code> <code>+ Thread.CurrentThread.Name);</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

我們發現在ActionMethod方法中,lock(this)這一行被注釋掉了。

我們看一下運作狀況。

這是沒加lock(this)的運作情況                      這是加了lock(this)的運作情況

C# 多線程的實作
C# 多線程的實作

這就引出了一個線程同步的概念。也就是說,我們在程式中想辦法,對多個線程的執行進行協調,使線程按照順序來執行。線程同步的意思并不是說多個線程保持同樣的次序輸出,而是說單獨的線程執行不被其他線程所幹擾,要執行下一個線程必須等待該線程結束才能進行。這樣才能保證多個線程輸出的一緻和同步。

說到這裡,我想有人想問,多個線程同時執行,我怎麼去對他們執行的優先級進行控制呢?比如,我想讓線程1的活先幹完,然後讓線程2的活幹完,最後是線程3的活幹完。

這是很自然的需求,C#很友善的進行了實作。

還是利用上面的代碼,線上程執行之前,我們加下面這3行代碼。

<code>test[0].Priority = ThreadPriority.Highest;</code><code>//優先級最高</code>

<code>test[1].Priority = ThreadPriority.Lowest;</code><code>//優先級最低</code>

<code>test[2].Priority = ThreadPriority.Normal;</code><code>//優先級正常</code>

最後,我們将做一個累加器,用多線程來實作。

首先我們畫一個winform界面

C# 多線程的實作

然後我們再開始計算按鈕下面輸入如下代碼(這裡的控件名沒改,讀者自行修改):

<code>this</code><code>.textBox4.Text = </code><code>"0"</code><code>;</code>

<code>listBox1.Items.Clear();</code>

<code>int</code> <code>threadNumber = Convert.ToInt32(</code><code>this</code><code>.textBox3.Text);</code>

<code>for</code> <code>(</code><code>int</code> <code>i = 1; i &lt;= threadNumber; i++)</code>

<code>    </code><code>ThreadStart threadStart = </code><code>new</code> <code>ThreadStart(Add);</code>

<code>    </code><code>Thread thread = </code><code>new</code> <code>Thread(threadStart);</code>

<code>    </code><code>thread.Name = i.ToString();</code>

<code>    </code><code>thread.Start();</code>

16

17

18

19

20

21

22

23

24

25

26

27

28

<code>private</code> <code>void</code> <code>Add()</code>

<code>    </code><code>DateTime beginTime = DateTime.Now;</code>

<code>    </code><code>long</code> <code>minValue = </code><code>long</code><code>.Parse(textBox1.Text);</code>

<code>    </code><code>long</code> <code>maxValue = </code><code>long</code><code>.Parse(textBox2.Text);</code>

<code>    </code><code>int</code> <code>threadNumber = Convert.ToInt32(textBox3.Text);</code>

<code>    </code><code>int</code> <code>threadOrder = Convert.ToInt32(Thread.CurrentThread.Name);</code>

<code>            </code> 

<code>    </code><code>long</code> <code>step = (maxValue - minValue + 1) / threadNumber;</code>

<code>    </code><code>long</code> <code>beginValue = minValue + step * (threadOrder - 1);</code>

<code>    </code><code>long</code> <code>endValue = beginValue + step;</code>

<code>    </code><code>long</code> <code>result = 0;</code>

<code>    </code><code>for</code> <code>(</code><code>long</code> <code>i = beginValue; i &lt; endValue; i++)</code>

<code>        </code><code>result += i;</code>

<code>    </code><code>lock</code> <code>(</code><code>this</code><code>)</code>

<code>        </code><code>long</code> <code>sum = </code><code>long</code><code>.Parse(textBox4.Text);</code>

<code>        </code><code>sum += result;</code>

<code>        </code><code>textBox4.Text = sum.ToString();</code>

<code>    </code><code>DateTime endTime = DateTime.Now;</code>

<code>    </code><code>TimeSpan timeSpan = endTime - beginTime;</code>

<code>    </code><code>string</code> <code>message = </code><code>"線程"</code> <code>+ Thread.CurrentThread.Name + </code><code>":"</code> <code>+ beginValue.ToString() + </code><code>"到"</code> <code>+ endValue.ToString() + </code><code>", 耗時:"</code> <code>+ timeSpan.TotalMilliseconds.ToString() + </code><code>"毫秒"</code><code>;</code>

<code>    </code><code>this</code><code>.listBox1.Items.Add(message);</code>

<code>    </code><code>Thread.CurrentThread.Abort();</code>

Add方法是一個核心方法,将需要計算的範圍按照線程數進行分割,這樣讓每個線程獨自的完成自己的任務,而不是一個線程從頭跑到尾。OK,我們檢視一下運作效果圖:

C# 多線程的實作

這裡可以看到每個線程的運作情況和執行情況。

本文轉自 guwei4037  51CTO部落格,原文連結:http://blog.51cto.com/csharper/1344192