天天看點

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:這一節也是建立在我們的硬體産品步步飛升的基礎之上,并行計算也絕對下一個需要密切關注的方向,

    它能充分利用現有硬體資源将性能最大化,當然赢得的利潤也會呈增數級甚至幾何數級增長,很期待...  

繼續閱讀