.NET Framework 4.5 五個很棒的特性

jobbole發表於2013-11-12

  簡介

  自.NET 4.5釋出已經過了差不多1年了。但是隨著最近微軟大多數的釋出,與.NET開發者交流的問題顯示,開發者僅知道一到兩個特性,其他的特性僅僅停留在MSDN並以簡單的文件形式存在著。

  比如說,當你問一個.NET開發者.NET框架核心中有什麼新東西的時候,他們中的大多數僅僅會說非同步與等待(至少和我交談的人們僅僅談到了這些特性)。

  另外也很難貫通所有的新特性。因為這些特性可能對於你目前正在開發的工作並不如聽上去那麼有趣。

  所以在這篇文章中我想提及我喜歡的5個在.NET4.5核心中的特性。當然,這可能只是我喜歡的而並不是你的。但是我所做的是當我選擇這些特性時我也想著較大的.NET社群,我希望我滿足了這種期望。

aehtrhthjtyj

  提示:這篇文章沒有討論在ASP.NET, WCF, WPF, WWF等中的新特性。僅僅講了關於核心的新特性。

   特性1:非同步與等待(程式碼開發者)

  這個特性已經被吹噓過度並且每個.NET佈道者都談論它。但是這仍然是我喜歡的並且你會知道為什麼從這裡只有幾行。

atrhrtjrt2

  非同步和等待是標記,它們標記當任務(執行緒)結束時控制應該恢復到程式碼的位置。

  讓我們嘗試通過下面的程式碼來搞清上面宣告的含義。如果你明白下面程式碼的流程:

  1. Static void main()從開始處呼叫Method()方法。
  2.  Method()方法產生一個名為LongTask的任務(執行緒),執行緒將等待10秒。
  3.  同時,在呼叫了任務之後,控制又回到Method()方法繼續執行剩下的程式碼。換句話說,正如呼叫時多執行緒的(Task.Run…),LongTask仍在執行。例如,等待10秒並且Method()方法剩下的程式碼也在執行。

  現在在相同的情景下,我們想要第3步執行得不一樣。我們想要在LongTask()執行完成後,控制應該回到Method方法執行接下來的程式碼。“非同步”和“等待”關鍵字能夠幫助實現上面的功能。

agfhgfnhgm3

  這裡有三個關於關鍵字“非同步”和“等待”的重點需要記住:

  1. 非同步和等待是一對關鍵字。你不能獨立使用它們。
  2. 非同步應用於方法。這個關鍵字是一個標誌,是說該方法會有一個等待關鍵字。
  3. 等待關鍵字標記了任務恢復執行的位置。所以你總是發現這個關鍵字與Task關聯。

  下面是前面討論的程式碼的修訂版本,這裡我們應用了非同步與等待。所有其他的步驟仍然如前所述,但是“步驟3”將在“步驟2”完成之後執行。簡單來說就是控制在任務完成之後回到Method()方法。

arhtrh4

  現在你已經閱讀了“非同步”與“等待”的內容,讓我來提個問題。上面的程式碼同樣也能通過Task.Wait或者Task.ContinueWith實現,那麼它們有什麼不同?我把這個問題留作給你的家庭作業。

  特性2:便利Zip壓縮(Zip壓縮)

sawfwsfa5

  Zip是最為人所接受的檔案格式之一。Zip格式以某些內建的名字被幾乎所有作業系統支援。

  • 在Windows作業系統中,它以“壓縮檔案”的名稱實現。
  • 在MAC作業系統中,它以“文件實用程式”的名稱實現。

  現在在.NET中我們對執行Zip壓縮沒有內建的支援。許多開發者實用第三方元件如“DotnetZip”。在.NET4.5中,Zip屬性內建於框架本身,以System.IO.Compression的名稱空間內建。

  第一步你需要引用兩個名稱空間:

  • System.IO.Compression.FileSystem
  • System.IO.Compression

  接下來引用如下兩個名稱空間:

using System.IO.Compression;

  如果你想要從資料夾壓縮檔案你可以呼叫如下所示的CreateFromDirectory函式。

ZipFile.CreateFromDirectory(@"D:\data",@"D:\data.zip");

  如果你想要解壓,你可以呼叫如下程式碼所示的ExtractToDirectory函式。

ZipFile.ExtractToDirectory(@"D:\data.zip", @"D:\data\unzip");

  特性3:正規表示式超時(超時)

ewfjdnvlgdklgv

  “正規表示式”一直是做驗證首選的方式。如果你是正規表示式的新手,請看正規表示式,我解釋了正規表示式是如何執行的。但是正因為正規表示式的典型邏輯解析使得它暴露於DOS攻擊下。讓我們試著理解剛才我說的。

  作為例子請考慮這樣的正規表示式-“^(\d+)$”。這個正規表示式表明只能有數字。你也可以看正規表示式符號圖,它標明瞭這個正規表示式會如何求值。現在讓我們假設要驗證“123456X”。這將有6條路徑如下圖所示。

afnhjgfnhgm7

  但如果我們再多加一個數字進去,將會有7條路徑。換句話說,隨著字元長度的增加,正規表示式將會花更多時間執行。也就是說,求值時間與字元長度成線性比例。

agnhgm8

  現在讓我們把之前定義的正則式從“^(\d+)$”變為“^(\d+)+$”。如果你看正規表示式符號圖它將相當複雜。如果我們現在試著驗證“123456X”,將會有32條路徑。如果你再增加一個字元,路徑數將會增加到64。

asdgvdfbfgn9

  換句話說,上面的正規表示式中時間開銷與字元數目為成倍關係。

adsbfdbfghrt10

  現在你可能要問的是,這很重要嗎?線性上升的求值時間可以被黑客利用來進行DOS(拒絕服務)攻擊。他們可以部署一個長而且是足夠長的字串來使你的應用永遠掛起。

  對於這個問題合適的解決方法是在正規表示式執行上設定超時時間。好訊息是,在.NET4.5中你可以定義一個超時屬性如下程式碼所示。所以如果你收到任何懷有惡意的字串,應用不會永遠在迴圈中執行。

try
{
  var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds(2));
  var match = regEx.Match(“123453109839109283090492309480329489812093809x”);
}
catch (RegexMatchTimeoutException ex)
{
  Console.WriteLine(“Regex Timeout”);
}

  特性4:優化配置檔案(提升啟動效能)

asdvdbfrbngrb 11

  我們都知道.NET程式碼是半編譯的格式。在執行時,JIT(Just-in-Time)編譯器執行並且轉換這種半編譯的IL程式碼為機器原生程式碼。對JIT最大的抱怨之一是當.NET應用初次執行的時候,它執行得很慢因為JIT在忙著轉換IL程式碼到機器程式碼。

  為了降低這個啟動時間,在.NET4.5中有稱為“優化配置檔案”的內容。配置檔案不過是一個記錄了應用在啟動執行中需要的方法列表的簡單檔案。所以當應用開始後,後臺的JIT執行並且開始轉換這些方法的IL程式碼為機器/原生語言。

  這個後臺JIT在多個處理器上編譯啟動方法從而進一步降低啟動時間。另外請注意你需要多核處理器來實現配置檔案優化。如果你沒有多核處理器那麼這個設定會被忽略。

afgngkmyjkytjy12

  為了建立“配置檔案”這個檔案,首先你需要引入System.Runtime名稱空間。然後你可以呼叫靜態類ProfileOptimization的SetProfileRoot和StartProfile方法。現在當應用啟動後臺JIT,它將會讀取配置檔案並且在後臺編譯啟動方法從而降低啟動時間。

using System.Runtime;

// Call the Setprofilerroot and Startprofile method
ProfileOptimization.SetProfileRoot(@"D:\ProfileFile");

ProfileOptimization.StartProfile("ProfileFile");

  重要提示:ASP.NET 4.5和Silverlight 5應用預設支援Profileoptimization。所以上述程式碼在這些技術中無需編寫。

  特性5:垃圾回收(垃圾後臺清理)

afgjrtk5ytjytn13

  垃圾回收在.NET應用中是一項真正繁重的任務。當是ASP.NET應用的時候,它變得更繁重。ASP.NET應用在伺服器執行,許多客戶端向伺服器傳送請求從而產生物件負荷,使得垃圾回收確實努力清理不需要的物件。

aedvgdbh4erh14

  在.NET4.0中,當垃圾回收執行清理的時候,所有的應用程式執行緒都暫停了。在上圖中你可以看到我們有3個應用程式執行緒在執行。有兩個垃圾回收執行在不同的執行緒上。一個垃圾回收執行緒對應一個邏輯處理器。現在應用程式執行緒執行並執行它們的任務,伴隨著這些應用程式執行緒的執行它們也建立了操作物件。

  在某個時間點,後臺垃圾回收執行開始清理。當這些垃圾回收開始清理的時候,它們暫停了所有的應用程式執行緒。這使得伺服器/應用程式在那一刻不響應了。

afvfbrtherg15

  為了克服上述問題,伺服器垃圾回收被引進了。在伺服器垃圾回收機制中多建立了一個執行在後臺的執行緒。這個執行緒在後臺執行並持續清理2代物件(關於垃圾回收0,1和2代的視訊)從而降低主垃圾回收執行緒的開銷。由於雙垃圾回收執行緒的執行,主應用程式執行緒很少被暫停,進而增加了應用程式吞吐量。為了使用伺服器垃圾回收,我們需要使用gcServer XML標籤並且將它置為true。

<configuration>
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

  另三個值得探索的特性

  設定預設應用程式域的區域性

  在上一個版本的.NET中如果我想設定區域性那麼我需要在每個執行緒中設定。下面的示例程式演示了線上程級別設定區域性的痛苦。當我們有大量多執行緒應用程式的時候這是真正的痛苦。

CultureInfo cul = new CultureInfo(strCulture);
Thread.CurrentThread.CurrentCulture = cul;
Thread.CurrentThread.CurrentUICulture = cul;

  在4.5中我們可以在應用程式域級別設定區域性並且所有在這個應用程式域當中的執行緒都會繼承這個區域性。下面就是如何實現DefaultThreadCurrentCulture的示例程式碼。

CultureInfo culture = CultureInfo.CreateSpecificCulture("fr-FR");

CultureInfo.DefaultThreadCurrentCulture = culture;

  陣列支援超過2GB容量

  我不確定在什麼樣的情景下我們會需要2GB的容器。所以我個人並不清楚我們將在哪用到這個特性。如果我曾需要如此之大的容器我會把它分解成小份。但我確信在框架中啟用此功能應該有個很好的理由。

  控制檯支援Unicode編碼

  我把這個特性留在討論範圍之外是因為非常少的人用控制檯程式工作。我曾見過有人把控制檯用於學術目的。總而言之,我們現在也對控制檯應用有了Unicode編碼支援。

  引用

  • http://msdn.microsoft.com/en-us/library/ms171868.aspx
  • Mr Sukesh marla的精彩文章ASP.NET 4.5 new features

  當你有空的時候,一定來看看我的網站 www.questpond.com關於.NET4.5面試問和答,我已經在這方面有了不少努力。

astrhhjync

  原文連結: Shivprasad koirala   翻譯: 伯樂線上 - EluQ

相關文章