天天看点

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