關於學習北京理工大學金旭亮老師在線課程的筆記。
介紹:
在線課程網址: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 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。
我們先看一些常規的委托是如何實現的。
委托方法的使用:
//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是開發高性能.NET應用程序的利器,是.Net程序異步編程的基石。學習它可以更好的學習async/await異步編程模式;
.NET平台中的並行計算組件
多線程和串行程序的比較
思考一下,為什麼會出現多線程編程,主要是合理的理由計算機CPU的資源,不讓其閒下來,在有限的時間內處理更多的事情,提高資源利用率。
提升抽象層次是降低軟件開發難度,提高軟件開發效率的有效方法;
Parallel開發並行計算程序
Paraller內置三種典型的代碼執行法式
這個Parallel是依賴於底層的Task類完成工作的。Task類的一個實例,代表一個可以被執行的工作任務,是“任務並行庫”中的和興類型;
基於TPL開發並行計算程序,幾乎所有的工作都圍繞著Task而展開
背景線程
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的運行結果