天天看點

.NET Framework 4.5 五個很棒的特性

簡介

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

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

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

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

.NET Framework 4.5 五個很棒的特性

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

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

.NET Framework 4.5 五個很棒的特性

異步和等待是标記,它們标記當任務(線程)結束時控制應該恢複到代碼的位置。

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

Static void main()從開始處調用Method()方法。

Method()方法産生一個名為LongTask的任務(線程),線程将等待10秒。

同時,在調用了任務之後,控制又回到Method()方法繼續執行剩下的代碼。換句話說,正如調用時多線程的(Task.Run…),LongTask仍在運作。例如,等待10秒并且Method()方法剩下的代碼也在執行。

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

.NET Framework 4.5 五個很棒的特性

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

異步和等待是一對關鍵字。你不能獨立使用它們。

異步應用于方法。這個關鍵字是一個标志,是說該方法會有一個等待關鍵字。

等待關鍵字标記了任務恢複執行的位置。是以你總是發現這個關鍵字與Task關聯。

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

.NET Framework 4.5 五個很棒的特性

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

.NET Framework 4.5 五個很棒的特性

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

在Windows作業系統中,它以“壓縮檔案”的名稱實作。

在MAC作業系統中,它以“文檔實用程式”的名稱實作。

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

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

System.IO.Compression.FileSystem

System.IO.Compression

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

1

<code>using System.IO.Compression;</code>

如果你想要從檔案夾壓縮檔案你可以調用如下所示的CreateFromDirectory函數。

<code>ZipFile.CreateFromDirectory(@"D:\data",@"D:\data.zip");</code>

如果你想要解壓,你可以調用如下代碼所示的ExtractToDirectory函數。

<code>ZipFile.ExtractToDirectory(@"D:\data.zip", @"D:\data\unzip");</code>

.NET Framework 4.5 五個很棒的特性

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

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

.NET Framework 4.5 五個很棒的特性

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

.NET Framework 4.5 五個很棒的特性

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

.NET Framework 4.5 五個很棒的特性

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

.NET Framework 4.5 五個很棒的特性

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

對于這個問題合适的解決方法是在正規表達式執行上設定逾時時間。好消息是,在.NET4.5中你可以定義一個逾時屬性如下代碼所示。是以如果你收到任何懷有惡意的字元串,應用不會永遠在循環中執行。

2

3

4

5

6

7

8

9

<code>try</code>

<code>{</code>

<code></code><code>var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds(2));</code>

<code></code><code>var match = regEx.Match(“123453109839109283090492309480329489812093809x”);</code>

<code>}</code>

<code>catch (RegexMatchTimeoutException ex)</code>

<code></code><code>Console.WriteLine(“Regex Timeout”);</code>

.NET Framework 4.5 五個很棒的特性

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

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

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

.NET Framework 4.5 五個很棒的特性

為了建立“配置檔案”這個檔案,首先你需要引入System.Runtime命名空間。然後你可以調用靜态類ProfileOptimization的SetProfileRoot和StartProfile方法。現在當應用啟動背景JIT,它将會讀取配置檔案并且在背景編譯啟動方法進而降低啟動時間。

<code>using System.Runtime;</code>

<code>// Call the Setprofilerroot and Startprofile method</code>

<code>ProfileOptimization.SetProfileRoot(@"D:\ProfileFile");</code>

<code>ProfileOptimization.StartProfile("ProfileFile");</code>

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

.NET Framework 4.5 五個很棒的特性

垃圾回收在.NET應用中是一項真正繁重的任務。當是ASP.NET應用的時候,它變得更繁重。ASP.NET應用在伺服器運作,許多用戶端向伺服器發送請求進而産生對象負荷,使得垃圾回收确實努力清理不需要的對象。

.NET Framework 4.5 五個很棒的特性

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

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

.NET Framework 4.5 五個很棒的特性

為了克服上述問題,伺服器垃圾回收被引進了。在伺服器垃圾回收機制中多建立了一個運作在背景的線程。這個線程在背景運作并持續清理2代對象(關于垃圾回收0,1和2代的視訊)進而降低主垃圾回收線程的開銷。由于雙垃圾回收線程的執行,主應用程式線程很少被暫停,進而增加了應用程式吞吐量。為了使用伺服器垃圾回收,我們需要使用gcServer XML标簽并且将它置為true。

<code>&lt;configuration&gt;</code>

<code></code><code>&lt;runtime&gt;</code>

<code></code><code>&lt;gcServer enabled="true"/&gt;</code>

<code></code><code>&lt;/runtime&gt;</code>

<code>&lt;/configuration&gt;</code>

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

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

<code>CultureInfo cul = new CultureInfo(strCulture);</code>

<code>Thread.CurrentThread.CurrentCulture = cul;</code>

<code>Thread.CurrentThread.CurrentUICulture = cul;</code>

在4.5中我們可以在應用程式域級别設定區域性并且所有在這個應用程式域當中的線程都會繼承這個區域性。下面就是如何實作DefaultThreadCurrentCulture的示例代碼。

<code>CultureInfo culture = CultureInfo.CreateSpecificCulture("fr-FR");</code>

<code>CultureInfo.DefaultThreadCurrentCulture = culture;</code>

數組支援超過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面試問和答,我已經在這方面有了不少努力。

本文轉自94cool部落格園部落格,原文連結:http://www.cnblogs.com/94cool/p/3422614.html,如需轉載請自行聯系原作者