一.课堂内容
上回策马奔腾讲到17章,这次从第18章讲到了22章。
18章WPF应用,这个在即将要截至的大实验中有被要求......19章Windows Form Application,20章attributes and reflection,21章线程与同步,22章stream流。不得不说内容的确非常非常的充实,我感觉我需要很长很长的时间才能够将所有的知识接触理解消化。
故,由于时间的问题,这篇博客只能比较短暂的就其中的某些知识点进行一下基础的探究。
二.学习内容
1.C#线程与同步。
线程与同步一直都是各种编程语言中比较麻烦的知识点,在这里我再做一些练习和学习。
一下是我找的一个线程同步的练习例子。
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Threading; 5 6 namespace ThreadDemo 7 { 8 public class ThreadDemo 9 { 10 private Thread threadOne; 11 private Thread threadTwo; 12 private ArrayList stringList; 13 private event EventHandler OnNumberClear;//数据删除完成引发的事件 14 public static void Main() 15 { 16 ThreadDemo demo = new ThreadDemo(1000); 17 demo.Action(); 18 } 19 public ThreadDemo(int number) 20 { 21 Random random = new Random(1000000); 22 stringList = new ArrayList(number); 23 for (int i = 0; i < number; i++) 24 { 25 stringList.Add(random.Next().ToString()); 26 } 27 threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情 28 threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情 29 threadOne.Name = "线程1"; 30 threadTwo.Name = "线程2"; 31 OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear); 32 33 } 34 /// <summary> 35 /// 开始工作 36 /// </summary> 37 public void Action() 38 { 39 threadOne.Start(); 40 threadTwo.Start(); 41 } 42 /// <summary> 43 /// 共同做的工作 44 /// </summary> 45 private void Run() 46 { 47 string stringValue = null; 48 while (true) 49 { 50 Monitor.Enter(this);//锁定,保持同步 51 stringValue = (string)stringList[0]; 52 Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue); 53 stringList.RemoveAt(0);//删除ArrayList中的元素 54 if (stringList.Count == 0) 55 { 56 OnNumberClear(this, new EventArgs());//引发完成事件 57 } 58 Monitor.Exit(this);//取消锁定 59 Thread.Sleep(5); 60 } 61 } 62 63 //执行完成之后,停止所有线程 64 void ThreadDemo_OnNumberClear(object sender, EventArgs e) 65 { 66 Console.WriteLine("执行完了,停止了所有线程的执行。"); 67 threadTwo.Abort(); 68 threadOne.Abort(); 69 70 } 71 } 72 }
运行的结果如下(结果不完全,因为这个程序要跑若干秒):
好的,让我们一起来分析一下这段代码,我认为这段代码里面包含了很多PPT内的知识点,而且还有不少PPT没有讲到的东西,只要你足够细心。
首先我们来看ThreadDemo的构造函数,首先这个构造函数需要一个int型参数,这个参数用来定义stringList的大小,然后用随机数塞满这个list,并且声明两个线程,threadone、threadtwo,这里threadOne = new Thread(new ThreadStart(Run))中,这里的额ThreadStart正如ppt中所说的那样,使我们上个礼拜讲过的delegation,也就是委托,类似于函数的指针,这里是把Run这个函数,交给了两个线程。
然后在Run这个函数中,我们首先看到:
这里涉及到章老师上课讲的,同步的线程对共享数据的使用。这里的Monitor是三种同步机理中的一种,另外两种分别是:
The Interlock Class
The C# Lock Statement
这种锁定,应该是防止同步的线程在对共享的数据同时使用时发生错乱吧。
然后我们看到Thread.sleep(5);这行代码是让线程等待5ms也就是0.005秒,ppt中讲到,sleep这个函数是被重载过的,这里用的是下图中第一个语义用法:
关于后面的Thread.Abort(),这里用了PPT中的第三个Kill Threads的方法:
Thread.Abort()应该比Thread.Interrupt()更加强制一点吧?
此外,这个这个和这个
好像很厉害啊,但我还没绕明白= =。
(因为助教10点看,只能先发一半 = =)