.NET Framework 4.5 五个新特性

Framework 4.5 已经开发了几个项目了,想去研究一下VS 2015 里面的跨平台。。不过好像4.5内核新特性还没搞明白呢仍是先看看4.5内核新特性吧,4.5 .NET框架内核中有什么新东西的时候中的新特性?好像仍是不是很清楚,最多就是你们经常会说的Async and Await还能够用上一下,大部分人也就了解这个了。。。。相信这个框架确定不止这一个特性html

引用:
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");
        }

运行结果:async

看看关键字使用上以后的效果:异步编程

       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 method
ProfileOptimization.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编码

相关文章
相关标签/搜索