C#程序默认情况下具有一个线程,代码也都是从上至下逐行执行的。 不过,可以创建辅助线程,以便与主线程一起并行执行代码。 这些线程通常称为“辅助线程”。.NET Framework System.Threading 命名空间使线程更易于使用。
创建线程
创建新的 Thread 对象时,将创建新的托管线程。 Thread 类具有接受一个 ThreadStart 委托或 ParameterizedThreadStart 委托的构造函数:该委托包装调用 Start 方法时由新线程调用的方法。 多次调用 Start 将引发 ThreadStateException。
System.Threading.Thread newThread = new System.Threading.Thread(AMethod);
若要开始执行新线程,可使用 Start 方法,
若要停止执行线程,可使用 Abort 方法,
除启动和停止线程之外,还可以通过调用 Sleep方法,当前线程立即阻止,阻止时间的长度等于传递给 Thread.Sleep 的毫秒数 ,
Suspend ()方法挂起线程、使用 Resume 方法继续挂起的线程,(挂起和继续已过时),
以及使用 Abort 方法销毁线程。
1 public static void ThreadProc()
2 {
3 for (int i = 0; true; i++)
4 {
5 Console.WriteLine("ThreadProc: {0}", i);
6 Thread.Sleep(0);
7 }
8 }
9
10
11 static void Main(string[] args)
12 {
13 //主线程开始
14 Console.WriteLine("Main thread: Start");
15
16 Thread t = new Thread(new ThreadStart(ThreadProc));17
18 //辅助线程开始
19 t.Start();
20
21 //暂停5毫秒
22 Thread.Sleep(5);
23 for (int i = 0; i < 4; i++)
24 {
25 Console.WriteLine("Main thread: Do some work.{0}",i);
26 Thread.Sleep(0);
27 }
28 //辅助线程结束
29 t.Abort();
30 Console.ReadLine();
ThreadProc()方法看起来是一个死循环,但是当调用t.Abort()方法就会停止辅助线程,从而结束!
简单的传参和回调
1 public class Number
2 {
3 private int one;
4 private int two;
56
7 private CallbackCalculate callback;
8
9 public Number(int numberOne,int numberTwo,CallbackCalculate callbackDelegate)
10 {
11 one = numberOne;
12 two = numberTwo;
13 callback = callbackDelegate;
14 }
15
16 public void Calculate()
17 {
18 Thread.Sleep(10);
19 Console.WriteLine(((char)one).ToString()+((char)two).ToString());
20 if (callback!=null)
21 {
22 callback(one + two);
23 }
24 }
25 }
26
27 //回调委托
28 public delegate void CallbackCalculate(int result);
29
30
31 class Program
32 {
33 static void Main(string[] args)
34 {
35 Number number = new Number(65, 97, new CallbackCalculate(Callback));
36
37 Thread t = new Thread(new ThreadStart(number.Calculate));
38
39 //表示当前线程是否是后天线程
40 t.IsBackground = false;
41
42 //当前线程优先级
43 t.Priority = ThreadPriority.Highest;
44
45 t.Start();
46 Console.WriteLine("主线程做一些工作,然后等待");
47 //使当前线程一直等到另一线程完成
48 t.Join();
49 Console.WriteLine("独立的任务已经完成,主线程结束");
50 Console.ReadLine();
51 }
52
53 private static void Callback(int result)
54 {
55 Console.WriteLine("Main Number:{0}",result);
56 }
57 }
需要注意的是主线程和创建的辅助线程都默认是前台线程Thread.IsBackground = false;后台线程与前台线程类似,但后台线程不阻止进程停止。 一旦某个进程的所有前台线程都停止,公共语言运行时就会对仍处于活动状态的后台线程调用 Abort 方法,从而结束该进程。