.NET Framework 4.5 五個新特性 -

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

Framework 4.5 已經開發了幾個項目了,想去研究一下VS 2015 里面的跨平臺。。不過好像4.5內核新特性還沒搞明白呢還是先看看4.5內核新特性吧,4.5 .NET框架內核中有什么新東西的時候中的新特性?好像還是不是很清楚,最多就是大家常常會說的Async and Await還可以用上一下,大部分人也就了解這個了。。。。相信這個框架肯定不止這一個特性

引用:
https://msdn.microsoft.com/zh-cn/library/ms171868.aspx

 

今天有點空就先看看4.5中還有什么比較好的新特性。(下面大部分內容來自網上,我只是整理性的學習)廢話不多說,開始:

特性1:異步與等待(Async and Await)

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

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

//async(C# 參考)
https://msdn.microsoft.com/zh-cn/library/vstudio/hh156513(v=vs.110).aspx

//使用 Async 和 Await 的異步編程(C# 和 Visual Basic)
https://msdn.microsoft.com/zh-cn/library/vstudio/hh191443(v=vs.110).aspx

先來一個模擬普通長時間操作方法:

      static void Main(string[] args)
        {
            Method();
            Console.WriteLine("Main Thread");
            Console.ReadKey();
        }static void Method()
        {
            Task.Run(new Action(LongTask));
            Console.WriteLine("New Thread");
        }     static void LongTask()
        {
            System.Threading.Thread.Sleep(10000);
            Console.WriteLine("LongTask");
        }

運行結果:

看看關鍵字使用上之后的效果:

       static void Main(string[] args)
        {
            Method();
            Console.WriteLine("Main Thread");
            Console.ReadKey();
        }static async void Method()
        {await Task.Run(new Action(LongTask));
            Console.WriteLine("New Thread");
        }static void LongTask()
        {
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("LongTask");
        }

 

運行結果:

 

看到輸出的結果就很明白了吧!

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

參考:https://msdn.microsoft.com/Zh-cn/library/hh485707.aspx/html

Zip是最為人所接受的文件格式之一。Zip格式以某些內置的名字被幾乎所有操作系統支持。

在Windows操作系統中,它以壓縮文件的名稱實現。
在MAC操作系統中,它以文檔實用程序的名稱實現。
現在在.NET中我們對執行Zip壓縮沒有內置的支持。許多開發者實用第三方組件如DotnetZip。在.NET4.5中,Zip屬性內置于框架本身,以System.IO.Compression的命名空間內置。

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

 

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

using System.IO.Compression;

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

 ZipFile.CreateFromDirectory(@"D:\data", @"D:\data.zip", CompressionLevel.Fastest, true, Encoding.UTF8);

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

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

 特性3:正則表達式超時(超時)

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

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

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

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

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

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

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

      static void Main(string[] args)
        {try{var regEx = new System.Text.RegularExpressions.Regex(@"^(\d+)+$", System.Text.RegularExpressions.RegexOptions.Singleline, TimeSpan.FromSeconds(2));var match = regEx.Match("123453109839109283090492309480329489812093809x");
            }catch (System.Text.RegularExpressions.RegexMatchTimeoutException ex)
            {
                Console.WriteLine("Regex Timeout");
            }
        }    

運行結果很明顯:

特性4:優化配置文件(提升啟動性能)

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

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

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

為了創建配置文件這個文件,首先你需要引入System.Runtime命名空間。然后你可以調用靜態類ProfileOptimization的SetProfileRoot和StartProfile方法。現在當應用啟動后臺JIT,它將會讀取配置文件并且在后臺編譯啟動方法從而降低啟動時間。

參考:https://msdn.microsoft.com/zh-cn/library/system.runtime.profileoptimization(v=vs.110).aspx

using System.Runtime; 
// Call the Setprofilerroot and Startprofile methodProfileOptimization.SetProfileRoot(@"C:\ProfileFile");
 
ProfileOptimization.StartProfile("ProfileFile");

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

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

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

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

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

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

另三個值得探索的特性
1.設置默認應用程序域的區域性
在上一個版本的.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;

2.數組支持超過2GB容量

3.控制臺支持Unicode編碼

 


Cnblogs 小哥 2015-08-23 08:57:28

[新一篇] ASO優化工具:MobileDevHQ

[舊一篇] Mono為何能跨平臺?聊聊CIL(MSIL) - 慕容小匹夫
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表