首先,上個多線程的概念。通過單獨的線程來執行某個任務,一個多線程程式可以執行多個任務,而且這些線程都是并行執行,同時執行多個線程的能力稱為多線程。
根據多線程的概念,我們知道,多線程可以提高程式的運作效率,加快運作的速度。比較典型的應用就是我們經常使用的下載下傳工具,就用到了多線程技術。
下面上一段代碼,看一下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 < 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 < 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)的運作情況
這就引出了一個線程同步的概念。也就是說,我們在程式中想辦法,對多個線程的執行進行協調,使線程按照順序來執行。線程同步的意思并不是說多個線程保持同樣的次序輸出,而是說單獨的線程執行不被其他線程所幹擾,要執行下一個線程必須等待該線程結束才能進行。這樣才能保證多個線程輸出的一緻和同步。
說到這裡,我想有人想問,多個線程同時執行,我怎麼去對他們執行的優先級進行控制呢?比如,我想讓線程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界面
然後我們再開始計算按鈕下面輸入如下代碼(這裡的控件名沒改,讀者自行修改):
<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 <= 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 < 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,我們檢視一下運作效果圖:
這裡可以看到每個線程的運作情況和執行情況。
本文轉自 guwei4037 51CTO部落格,原文連結:http://blog.51cto.com/csharper/1344192