.NETFramework4.5五个新特性
Framework 4.5 已经开发了⼏个项⽬了,想去研究⼀下VS 2015 ⾥⾯的跨平台。。不过好像4.5内核新特性还没搞明⽩呢还是先看看4.5内核新特性吧,4.5 .NET框架内核中有什么新东西的时候中的新特性?好像还是不是很清楚,最多就是⼤家常常会说的Async and Await 还可以⽤上⼀下,⼤部分⼈也就了解这个了。。。。相信这个框架肯定不⽌这⼀个特性
今天有点空就先看看4.5中还有什么⽐较好的新特性。(下⾯⼤部分内容来⾃⽹上,我只是整理性的学习)废话不多说,开始:
特性1:异步与等待(Async and Await)
这个特性已经被吹嘘过度并且每个.NET布道者都谈论它。但是这仍然是我喜欢的并且你会知道为什么从这⾥只有⼏⾏。
异步和等待是标记,它们标记当任务(线程)结束时控制应该恢复到代码的位置。
先来⼀个模拟普通长时间操作⽅法:
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压缩)
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攻击下。让我们试着理解刚才我说的。
aspnet和net的区别作为例⼦请考虑这样的正则表达式-“^(\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,它将会读取配置⽂件并且在后台编译启动⽅法从⽽降低启动时间。
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>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论