• C#复习⑧


    C#复习⑧

    2016年6月22日

    13:50

    Main Attribute & Threads 属性与线程

    1.Conditional Attribute 条件属性

    clip_image002

    #define debug         // preprocessor directive
    
    class C {
    
    [Conditional("debug")]        // only possible for void methods
    
    static void Assert (bool ok, string errorMsg) {
    
    if (!ok) {
    
    Console.WriteString(errorMsg);
    
    System.Environment.Exit(0);
    
    }
    
    }
    
    static void Main (string[] arg) {
    
    Assert(arg.Length > 0, "no arguments specified");
    
    Assert(arg[0] == "...", "invalid argument");
    
    ...
    
    }
    
    }

    断言仅被调用,如果定义了debug。

    Assert is only called, if debug was defined.

    还可用于控制跟踪输出。

    Also useful for controlling trace output.

    2.Serialization 序列化

    clip_image003

    3.AttributeUsage

    clip_image004

    定义自己的Attribute:

    clip_image005

    4.线程

    clip_image006

    声明一个线程:

    //假设有方法void M(){}
    
    Thread t = new Thread(M);
    
    t.Start(); //线程执行

    5.Type类型

    public sealed class Thread {
    
    public static Thread CurrentThread { get; }        // static properties and methods
    
    public static void Sleep(int milliSeconds) {...}
    
    ...
    
    public Thread(ThreadStart startMethod) {...}        // thread creation
    
    public string Name { get; set; }        // properties
    
    public ThreadPriority Priority { get; set; }
    
    public ThreadState ThreadState { get; }
    
    public bool IsAlive { get; }
    
    public bool IsBackground { get; set; }
    
    ...
    
    public void Start() {...}        // methods
    
    public void Suspend() {...}
    
    public void Resume() {...}
    
    public void Join() {...}        // t.Join(): caller waits for t to die
    
    public void Abort() {...}        // throws ThreadAbortException
    
    public void Interrupt() {...}        // callable in WaitSleepState
    
    ...
    
    }
    
    public delegate void ThreadStart();        // parameterless void method
    
    public enum ThreadPriority {Normal, AboveNormal, BelowNormal, Highest, Lowest}
    
    public enum ThreadState {Unstarted, Running, Suspended, Stopped, Aborted, ...}

    举例:

    using System;
    
    using System.Threading;
    
    class Printer {
    
    char ch;
    
    int sleepTime;
    
    public Printer(char c, int t) {ch = c; sleepTime = t;}
    
    public void Print() {
    
    for (int i = 0; i < 100; i++) {
    
    Console.Write(ch);
    
    Thread.Sleep(sleepTime);
    
        }
    
      }
    
    }
    
    class Test {
    
    static void Main() {
    
    Printer a = new Printer('.', 10);
    
    Printer b = new Printer('*', 100);
    
    new Thread(a.Print).Start();
    
    new Thread(b.Print).Start();
    
      }
    
    }

    6.与Java的不同之处

    clip_image008

    7.线程的状态以及相互转化

    clip_image009

    using System;
    
    using System.Threading;
    
    class Test {
    
    static void P() {
    
    for (int i = 0; i < 20; i++) {
    
    Console.Write('-');
    
    Thread.Sleep(100);
    
      }
    
    }
    
    static void Main() {
    
    Thread t = new Thread(P);
    
    Console.Write("start");
    
    t.Start();
    
    t.Join(); // waits until t has finished
    
    Console.WriteLine("end");
    
      }
    
    }
    
    //Output
    
    // start--------------------end
    using System; using System.Threading;
    
    class Test {
    
    static void P() {
    
    try {
    
    try {
    
    try {
    
    while (true) ;
    
      } catch (ThreadAbortException) { Console.WriteLine("-- inner aborted"); }
    
        } catch (ThreadAbortException) { Console.WriteLine("-- outer aborted"); }
    
          } finally { Console.WriteLine("-- finally"); }
    
    }
    
    static void Main(string[] arg) {
    
    Thread t = new Thread(P);
    
    t.Start(); Thread.Sleep(0);
    
    t.Abort(); t.Join(); Console.WriteLine("done");
    
      }
    
    }
    
    /*Output
    
    -- inner aborted
    
    -- outer aborted
    
    -- finally
    
    done*/

    8.互斥Mutual Exclusion

    一次只能有一个线程掌握着该锁。直到该锁被释放才能被其他线程调用。

    举例:

    class Account {        // this class is a monitor
    
    long val = 0;
    
    public void Deposit(long x) {
    
    lock (this) { val += x; }        // only 1 thread at a time may execute this statement
    
    }
    
    public void Withdraw(long x) {
    
    lock (this) { val -= x; }
    
      }
    }

    锁可以加在任何类型上:

    object semaphore = new object();

    ...

    lock (semaphore) { ... critical region ... }

    9.Wait and Pulse

    Monitor.Wait(lockedVar);       // 大致等于wait() in Java (in Java lockedVar is always this)
    
    Monitor.Pulse(lockedVar);        //大致等于 notify() in Java
    
    Monitor.PulseAll(lockedVar);       // 大致等于 notifyAll() in Java

    举例:

    clip_image010

    PulseAll(v)唤醒所有等待的线程的V,但其中只有一个是允许继续。其他线程必须等待,直到前一个释放了锁。然后,下一个线程可能进入执行。

    PulseAll(v) wakes up all threads that wait for v, but only one of them is allowed to continue. The others must wait until the previous one has released the lock. Then the next thread may enter the critical region.

    举例:

    clip_image011

  • 相关阅读:
    代理模式之动态代理
    代理模式之静态代理
    基于Java类进行配置Spring
    Spring使用注解开发
    Spring的自动装配
    Bean的作用域
    Spring配置
    最全总结 | 聊聊 Python 办公自动化之 Excel(上)
    最全总结 | 聊聊 Python 数据处理全家桶(MongoDB 篇)
    最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5606974.html
Copyright © 2020-2023  润新知