天天看点

Dot Net FrameWork 4.0 学习笔记(4)

  终于可以有一天上午没有工作,但公司在这周不给调休的机会,哎,那就利用这些时间来继续写点学习笔记吧...  

  1.Named And Optional Arguments -  命名参数和可选参数    

     2.Dynamic Binding -  动态绑定 (dynamic  用于动态编程,其依赖于 Dynamic Language Runtime)

     3.Covariance -  泛型的协变     

        Contravariance -  泛型的逆变     

     4.CountdownEvent -  线程、任务同步类。线程或任务一直阻塞到  CountdownEvent  的计数为  0  为止    

        Barrier -  线程、任务同步类。其用来同步一个线程组或任务组中所有的线程或任务,先到达的线程或任务在此阻塞  

      1,        命名参数和可选参数   

         static void Main(string[] args)

     {  

         Write(1);  

         Write(1, "zhangsan");  

         Write(1, arg3: false, arg2: "webabcd");  

     }  

     static void Write(int arg1, string arg2 = "p2", bool arg3 = true)  

         Console.WriteLine(string.Format("p1:{0}; p2:{1}; p3:{2}", arg1, arg2, arg3.ToString()));  

     }    

      2,     动态绑定     

          public class DyanmicDemo

         public string Hello(string name)  

         {  

             return "hello: " + name;  

         }  

         public string Name { get; set; }  

         public string this[string value]  

             get  

             {  

                 return value;  

             }  

        public dynamic GetNames()  

        {  

            List<string> names = new List<string>() { "zhangsan", "wangwu", "zhaoliu" };  

            return names;

        }

   }

   public partial class DynamicBinding : System.Web.UI.Page

        protected void Page_Load(object sender, EventArgs e)  

            dynamic d = new DyanmicDemo();

            Response.Write(d.Hello("method"));

            d.Name = "hello: property";

            Response.Write(d.Name);

            Response.Write(d["hello: indexer"]);

            Response.Write(d.GetNames().Count.ToString());

            // 注意:下面这句会报错,因为不支持扩展方法  

            // Response.Write(d.GetNames().Last());  

        }  

     }

        /*

       运行结果:  

       hello: method  

       hello: property  

       hello: indexer  

       3  

      */    

   其上呢就是动态类型为我们提供的绑定对象机制了,当然动态类型也可以做数据绑定等操作,也可以用于多种开发模式之上,详见msdn啦

   3,泛型协变 (当然普通的类中这些操作都是被允许的)

   public class People

   {

       // 某某属性

   public class Student : People

   static void Main(string[] args)

       List<People> list = peopleList.Union(studentList).ToList();    // 协变

       List<People> list2 = studentList.ToList<People>();   // 协变

   /*

    运行结果:

    当然他们的相同属性值应该被合并或转型

   */

   // 协变简单来说就是将子类泛型转换成父类泛型的过程,究其原因是因为List<T> 实现了如下接口 IEnumerable<out T> ,所以可以实现协变,当然逆变的话,我们也需要让转换类实现这个过程,当然ms并没有提供类似方案,那么我们就需要自定义转换类型 IOutput<in T>

   interface IOutput<in T>

       void Write(T o);

   class Output<T> : IOutput<T> where T : People   // 转换类型限制

       public void Write(T o)

       {

           Console.WriteLine(o.GetType().ToString());

       }

   IOutput<People> peopleList = new Output<People>();

   IOutput<Student> studentList = peopleList;

   // 因为student是people的子类,所以这也是实现逆变的条件

   4,线程、任务同步类

   CountdownEvent 

      using (var countdown = new CountdownEvent(1))

      {

             // 启动工作项,增加1个计数,还需要将CountdownEvent的对象注册到工作方法中去

            Thread t1 = new Thread(() => ThreadWork("zhangsan", TimeSpan.FromSeconds(0), countdown));

            countdown.AddCount();

            // 当所有的工作项都已经同步完毕,减少1个计数

            countdown.Signal();

            // 阻塞当前线程,直到 CountdownEvent 的计数为零

            countdown.Wait();

     ps:大家看到CountdownEvent可能会觉得疑问,CountdownEvent的使用会和Interlocked会很像,要注意的是

CountdownEvent用于并行运算处理工作项线程同步问题,而Interlocked则用于异步请求的原子操作,虽然

都是将变量进行加减,但意义不同   /微笑

    Barrier

    // Barrier(int participantCount) - 实例化一个 Barrier

    // int participantCount - 需要阻塞的相关线程或任务数

    Barrier  barrier = new Barrier(2);

    // 在回调函数或托管方法中,利用barrier可完成工作项线程的同步.barrier不需要为工作项线程注册.

    // 当指定数量的线程或任务完成后,同步这些线程或任务

    barrier.SignalAndWait();

    ps: 此方法类与Monitor,MarshalByRefObject,Mutex等同步类或基类使用方法类似,但Barrier用于并行环境之下

    以上就是第四节的全部内容

    下节我们将说说并行计算与任务管理,还有linq中的并行运算PLINQ

    ps:这一节也是建立在我们的硬件产品步步飞升的基础之上,并行计算也绝对下一个需要密切关注的方向,

    它能充分利用现有硬件资源将性能最大化,当然赢得的利润也会呈增数级甚至几何数级增长,很期待...  

继续阅读