程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在線課程筆記—.NET基礎,課程筆記.net

在線課程筆記—.NET基礎,課程筆記.net

編輯:關於.NET

在線課程筆記—.NET基礎,課程筆記.net


關於學習北京理工大學金旭亮老師在線課程的筆記。

介紹:

在線課程網址:http://mooc.study.163.com/university/BIT#/c

老師個人網站:http://jinxuliang.com/MainWebSite

10.10號開課的,主要有三個課程,其中我最想學習的就是老師最新的那個關於講解ASP.NET Core的課程。現在推出來一章,昨天我學習了,很是受益(雖然我環境還沒安裝好,電腦配置是個傷呀)。對於想了解Core相關技術的同學來說很有幫助。(最起碼有個參考的地方),其中後面還有關於依賴注入,IOC容器,AngularJS,DDD相關知識的講解(高大上的知識呀)。據說老師的這個網站就是通過ASP.NET Core技術來創建的。

dynamic類型

在之前的項目中就經常使用這個類型,但是對於這個知識點不是很清楚。今天算是重新學習了。

dynamic類型是動態類型,和我們常規的類型不一樣,它是可以改變變量的值的特殊類型。就好比下面的代碼一樣。


//dynamic是一種動態類型,可以在編譯的時候直接改變變量中的值。而不是像常規的類型一樣。不可以進行值的改變。
              dynamic test = "test1";
            Console.WriteLine(test.GetType());
            test = 23;
            Console.WriteLine(test.GetType());            


輸出就是倆個不同的類型,在我們的ASP.NET MVC中的ViewBag就是使用的是dynamic類型;(想不到吧>)

下面的例子是在此類型中添加委托方法。同樣可以將方法輸出。


            dynamic myBag = new ExpandoObject();
            myBag.intValue = 100;
            myBag.message = "hello";
            //聲明委托方法,str相當與方法的參數。{}中的值就是方法體;
            Action<string> act = (str) => { Console.WriteLine(str); };
            //將方法賦值給say方法;
            myBag.say = act;
            Console.WriteLine(myBag.intValue*10);
            Console.WriteLine(myBag.message);
            myBag.say(myBag.intValue.ToString()); //方法參數為string類型
             myBag.say(myBag.message);


開始聲明了ExpandoObject()對象;這個是在命名空間System.Dynamic中的,裡面就一個方法,意思是表示一個對象,該對象包含可在運行時動態添加和移除的成員(包括屬性和方法)。方法是初始化不包含任何成員的新 ExpandoObject。

委托與Lambda表達式

我們先看一些常規的委托是如何實現的。

委托方法的使用:


      //1:聲明委托
       public delegate string SomeDelegateType(int value);    
      class MyClass
      {
          //2:定義委托方法
          public string process(int value)
         {
             return value.ToString();
         }
      }


          MyClass ob=new MyClass();
            //3:聲明委托變量,且為其賦值方法。
            SomeDelegateType del = ob.process;
            //4:調用委托,這個del其實就相當於process()方法一樣。
            Console.WriteLine(del(100));


改造後的Lambda表達式:


    //1:聲明委托
    public delegate string SomeDelegateType(int value);    
   SomeDelegateType del = (value) =>value.ToString();
   Console.WriteLine(del(100));


比較:

使用Lambda表達式可以不需要寫那麼多的代碼,委托的實際方法不需要定義。不需要實例化變量。其實要是使用自帶的委托類型還不需要定義委托;


            Func<int,string> del = (value) =>value.ToString();
            Console.WriteLine(del(100));


了解Lambda表達式:

任務並行庫(TPL:Task Parallel Library)

TPL是開發高性能.NET應用程序的利器,是.Net程序異步編程的基石。學習它可以更好的學習async/await異步編程模式;

  • 開發並行程序的關鍵在於找到一個合適的任務分解方案;
  • 並行總要付出一定的代價,比如線程同步,線程通信,同步緩沖數據等都是需要考慮的問題。
  • 需要仔細設計並行算法,並且應該在多個軟硬件環境中測試。

.NET平台中的並行計算組件

多線程和串行程序的比較

思考一下,為什麼會出現多線程編程,主要是合理的理由計算機CPU的資源,不讓其閒下來,在有限的時間內處理更多的事情,提高資源利用率。

   提升抽象層次是降低軟件開發難度,提高軟件開發效率的有效方法;


 

Parallel開發並行計算程序

Paraller內置三種典型的代碼執行法式

  • Parallel.Invoke();並行執行方式;
  • Parallel.For();並行循環;
  • Parallel.ForEach();並行迭代;

這個Parallel是依賴於底層的Task類完成工作的。Task類的一個實例,代表一個可以被執行的工作任務,是“任務並行庫”中的和興類型;

基於TPL開發並行計算程序,幾乎所有的工作都圍繞著Task而展開

背景線程

  • 主線程結束之後背景線程才結束;
  • 異步調用是由線程遲中的線程負責執行的;
  • await語句不會阻塞調用者線程;
  • 同一個方法中的代碼,以await為邊界,被劃分為兩塊(或者多塊,取決於await語句有多少個),然後,會由線程池中的某個線程來負責執行它們。
  • async/await 實際上是一種語法糖,它的功能完全可以由TPL實現,也可以直接使用線程實現,使用async/await的好處是可以寫出簡潔的代碼;

async/await適合的場景
  多線程的桌面應用程序;
  服務端的I/O密集操作;

並行計算任務的創建與啟動

1:可以直接通過new關鍵字創建一個Task對象,Task的構造函數接收一個Action類型的委托,用於封裝需要並行執行的功能代碼;

任務對象創建完畢之後,調用它的Start()方法啟動,此任務將被追加到線程池的任務列表中調度執行。

     t.Start();

2:可以把Task對象的創建和運行結合在一起;

    Task t=Task.Factory.StartNew(
                  () =>{ 任務方法});

     Task s = Task.Run(()=>{});

返回一個”用於延遲”的任務

Task.Delay()方法返回一個Task對象,它主要用在有await/async的異步方法中,其特點是不會阻塞調用者線程;實際開發中這樣使用這個

       await Task.Delay(5000);

demo

        private static void UseTask()
        {
            Console.WriteLine("使用Task.Delay()方法拖慢程序運行速度");
            //通過委托來實例化函數,來操作異步;
            Task.Run(() =>
            {
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine("{0}",i);
                    Task.Delay(500).Wait();                           //線程等待
                }
            }).Wait();      
        }

取回Task的運行結果

  • 使用傳統的多線程編程技術,利用線程同步對象取回結果;
  • 使用Task<T>.Result,以阻塞等待方式取回結果;
  • 使用Task.ContinueWith()方法,以回調方式取回結果;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved