關於學習北京理工大學金旭亮老師線上課程的筆記。 介紹: 線上課程網址:http://mooc.study.163.com/university/BIT#/c 老師個人網站:http://jinxuliang.com/MainWebSite 10.10號開課的,主要有三個課程,其中我最想學習的就是老師... ...
關於學習北京理工大學金旭亮老師線上課程的筆記。
介紹:
線上課程網址: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()方法,以回調方式取回結果;