zoukankan      html  css  js  c++  java
  • TJU_SCS_C#学习笔记(7)(上)

    一.课堂内容

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

  • 相关阅读:
    AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
    AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
    url 编码(percentcode 百分号编码)(转载)
    AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy
    使用UICollectionView实现首页的滚动效果
    AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
    c 线程(平行世界)
    ZFPlayer 源码解读
    ios 音视频实现边播边缓存的思路和解决方案 (转)
    c 网络与套接字socket
  • 原文地址:https://www.cnblogs.com/blueContra/p/4477725.html
Copyright © 2011-2022 走看看