代码改变世界

TJU_SCS_C#学习笔记(7)(上)

2015-05-04 22:11  blueContra  阅读(156)  评论(0编辑  收藏  举报

一.课堂内容

  上回策马奔腾讲到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点看,只能先发一半 = =)