代码改变世界

C#多线程技术(一)

2010-02-21 23:44  ubunoon  阅读(560)  评论(0编辑  收藏  举报

公司项目有可能采用C#编写,如果用到,必然会涉及到多线程技术,基本的概念都是相同的,差别是具体的代码。

 

在C#中,线程函数执行被封装在类中,通过类对象的Start函数启动线程执行函数。线程类Thread接受的是一个ThreadStart的delegate类型对象,具体代码应该如下:

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 
 7 namespace MultiThreadTest
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Thread thread1 = new Thread(
14                         delegate()
15                         {
16                             Console.WriteLine("Hello Here!");
17                         }
18                     );
19             Thread thread2 = new Thread(
20                     () =>            // lambda 表达式
21                     {
22                         Console.WriteLine("Well then goodbye!\n");
23                     }
24                 );
25 
26             thread1.Start();
27             thread2.Start();
28         }
29     }
30 }
31 

 

 通常在多线程中,我们需要等待所有的线程都结束,系统才会等待运行退出。这个时候,可以调用线程对象的Join函数,该函数在线程达到尾部结束的时候,会进行线程返回。

 

当线程个数很多的时候,不带参数的Join函数需要多次调用,非常费时费劲,这个时候,可以调用带时间参数的Join函数,当超过时间后,系统强制结束线程运行,如下面的代码:

 

1             if ( !thread.Join(30000))
2             {
3                 thread.Abort();
4             }

 

 

 之前处理的线程函数,都无法对数据状态进行保存处理,这样,对于复杂应用显然不是特别适合,C#的Thread采用ThreadStart委托方式,可以很好的解决这个问题:

 

代码
 1     class ThreadedTask{
 2         string _whatToSay;
 3         public ThreadedTask(string whatToSay){
 4             _whatToSay = whatToSay;
 5         }
 6 
 7         public void MethodToRun(){
 8             Console.WriteLine("I am babbling ( " + _whatToSay + " )");
 9         }
10     }
11 
12 
13         ThreadedTask task = new ThreadedTask("hello");
14 
15         Thread thread = new Thread(
16                             new ThreadStart(task.MethodToRun)
17                         );
18         thread.Start();

 

 字符串hello被存在类中,通过委托的方式将MethodToRun方法委托到线程内部,然后调用Start函数,这个时候,保存到类中的数据也可以被准确获取出来。