C# 多线程的实现

简介:

首先,上个多线程的概念。通过单独的线程来执行某个任务,一个多线程程序可以执行多个任务,而且这些线程都是并行执行,同时执行多个线程的能力称为多线程。

根据多线程的概念,我们知道,多线程可以提高程序的运行效率,加快运行的速度。比较典型的应用就是我们经常使用的下载工具,就用到了多线程技术。

在C#里面,.net framework为我们提供了多线程的实现。微软的msdn文档,也给出了实例。见 MSDN Thread类说明

下面上一段代码,看一下C#中如何实现多线程。

我们在控制台项目中,键入如下代码:

Main函数中定义了3个线程的线程数组,然后循环调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static  void  Main( string [] args)
{
     TestThread testThread =  new  TestThread();
     Thread[] test =  new  Thread[]
     {
         new  Thread( new  ThreadStart(testThread.ActionMethod)),
         new  Thread( new  ThreadStart(testThread.ActionMethod)),
         new  Thread( new  ThreadStart(testThread.ActionMethod))
     };
     for  ( int  i = 0; i < test.Length; i++)
     {
         test[i].Name =  "子线程"  + i;
         test[i].Start();
     }
}

这是一个普通的方法,用于测试线程的执行情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  TestThread
{
     public  void  ActionMethod()
     {
         //lock (this)
         {
             for  ( int  i = 0; i < 5; i++)
             {
                 Console.WriteLine( "线程名:"  + Thread.CurrentThread.Name);
             }
         }
     }
}

我们发现在ActionMethod方法中,lock(this)这一行被注释掉了。


我们看一下运行状况。

这是没加lock(this)的运行情况                      这是加了lock(this)的运行情况

CenterCenter

很显然,lock将每一个线程对象锁住,直到该对象释放为止。我们看看官方的解释:lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。见 msdn lock

这就引出了一个线程同步的概念。也就是说,我们在程序中想办法,对多个线程的执行进行协调,使线程按照顺序来执行。线程同步的意思并不是说多个线程保持同样的次序输出,而是说单独的线程执行不被其他线程所干扰,要执行下一个线程必须等待该线程结束才能进行。这样才能保证多个线程输出的一致和同步。

说到这里,我想有人想问,多个线程同时执行,我怎么去对他们执行的优先级进行控制呢?比如,我想让线程1的活先干完,然后让线程2的活干完,最后是线程3的活干完。

这是很自然的需求,C#很方便的进行了实现。

还是利用上面的代码,在线程执行之前,我们加下面这3行代码。

1
2
3
test[0].Priority = ThreadPriority.Highest; //优先级最高
test[1].Priority = ThreadPriority.Lowest; //优先级最低
test[2].Priority = ThreadPriority.Normal; //优先级正常

关于优先级枚举,可参见msdn ThreadPriority

最后,我们将做一个累加器,用多线程来实现。

首先我们画一个winform界面

Center

然后我们再开始计算按钮下面输入如下代码(这里的控件名没改,读者自行修改):

1
2
3
4
5
6
7
8
9
10
this .textBox4.Text =  "0" ;
listBox1.Items.Clear();
int  threadNumber = Convert.ToInt32( this .textBox3.Text);
for  ( int  i = 1; i <= threadNumber; i++)
{
     ThreadStart threadStart =  new  ThreadStart(Add);
     Thread thread =  new  Thread(threadStart);
     thread.Name = i.ToString();
     thread.Start();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private  void  Add()
{
     DateTime beginTime = DateTime.Now;
     long  minValue =  long .Parse(textBox1.Text);
     long  maxValue =  long .Parse(textBox2.Text);
     int  threadNumber = Convert.ToInt32(textBox3.Text);
     int  threadOrder = Convert.ToInt32(Thread.CurrentThread.Name);
             
     long  step = (maxValue - minValue + 1) / threadNumber;
     long  beginValue = minValue + step * (threadOrder - 1);
     long  endValue = beginValue + step;
     long  result = 0;
     for  ( long  i = beginValue; i < endValue; i++)
     {
         result += i;
     }
     lock  ( this )
     {
         long  sum =  long .Parse(textBox4.Text);
         sum += result;
         textBox4.Text = sum.ToString();
     }
     DateTime endTime = DateTime.Now;
     TimeSpan timeSpan = endTime - beginTime;
     string  message =  "线程"  + Thread.CurrentThread.Name +  ":"  + beginValue.ToString() +  "到"  + endValue.ToString() +  ", 耗时:"  + timeSpan.TotalMilliseconds.ToString() +  "毫秒" ;
     this .listBox1.Items.Add(message);
     Thread.CurrentThread.Abort();
}

Add方法是一个核心方法,将需要计算的范围按照线程数进行分割,这样让每个线程独自的完成自己的任务,而不是一个线程从头跑到尾。OK,我们查看一下运行效果图:


Center
这里可以看到每个线程的运行情况和执行情况。



本文转自 guwei4037  51CTO博客,原文链接:http://blog.51cto.com/csharper/1344192

相关文章
|
22天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
2月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
2月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
2月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
2月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
2月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
5天前
|
安全 Java C#
C#多线程详解
C#多线程详解
12 0
|
2月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
2月前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
|
2月前
|
Java C#
C#学习相关系列之多线程(六)----Task的初级使用
C#学习相关系列之多线程(六)----Task的初级使用