Es ist fast ein Jahr her, seit .NET 4.5 veröffentlicht wurde. Aber bei den meisten aktuellen Versionen von Microsoft haben Gespräche mit .NET-Entwicklern gezeigt, dass Entwickler nur über ein oder zwei Features Bescheid wissen, während andere Features einfach auf MSDN bleiben und in Form einer einfachen Dokumentation vorhanden sind.
Wenn Sie beispielsweise einen .NET-Entwickler fragen, was es Neues im .NETFrameworkKernel gibt, sagen die meisten einfach „async“ und warten ab (zumindest bei mir). Die Leute, mit denen wir gesprochen haben nur über diese Eigenschaften gesprochen).
Darüber hinaus ist es schwierig, alle neuen Funktionen zu verstehen. Weil diese Funktionen für die Arbeit, die Sie gerade entwickeln, möglicherweise nicht so interessant sind, wie sie klingen.
In diesem Artikel möchte ich daher 5 Funktionen erwähnen, die mir im .NET 4.5-Kernel gefallen. Natürlich kann es sein, dass dies nur meine Präferenz ist und nicht Ihre. Aber ich denke bei der Auswahl dieser Funktionen auch an die größere .NET-Community und hoffe, dass ich diese Erwartung erfülle.
Tipp: In diesem Artikel werden nicht die neuen Funktionen in ASP.NET, WCF, WPF, WWF usw. behandelt. Ich habe nur über die neuen Funktionen des Kernels gesprochen.
Diese Funktion wurde überbewertet und jeder .NET-Evangelist spricht darüber. Aber das ist es immer noch, was mir gefällt, und Sie werden sehen, warum es nur ein paar Zeilen von hier entfernt sind.
Async und Wait sind Markierungen, die markieren, wo die Kontrolle zum Code zurückkehren soll, wenn die Aufgabe (der Thread) endet.
Versuchen wir, die Bedeutung der obigen Aussage mithilfe des folgenden Codes herauszufinden. Wenn Sie den Ablauf des folgenden Codes verstehen:
Static void main() ruft die Method()-Methode von Anfang an auf.
Die Method()-Methode generiert eine Aufgabe (Thread) mit dem Namen LongTask, und der Thread wartet 10 Sekunden.
Gleichzeitig kehrt die Steuerung nach dem Aufruf der Aufgabe zur Method()-Methode zurück, um mit der Ausführung des verbleibenden Codes fortzufahren. Mit anderen Worten, LongTask wird genauso wie beim Multithread-Aufruf (Task.Run ...) weiterhin ausgeführt. Warten Sie beispielsweise 10 Sekunden und der Rest der Method()-Methode wird ausgeführt.
Im selben Szenario möchten wir nun, dass Schritt 3 anders ausgeführt wird. Wir möchten, dass nach Abschluss der LongTask()-Ausführung die Kontrolle zur Method-Methode zurückkehrt, um den nächsten Code auszuführen. Die Schlüsselwörter „async“ und „await“ können dabei helfen, die oben genannten Funktionen zu erreichen.
Hier sind drei wichtige Punkte, die Sie bei den Schlüsselwörtern „async“ und „await“ beachten sollten:
Async und waiting sind A Paar von Schlüsselwörtern. Sie können sie nicht unabhängig voneinander verwenden.
Asynchron auf Methoden angewendet. Dieses Schlüsselwort ist ein Flag, was bedeutet, dass die Methode ein Warteschlüsselwort hat.
Das Schlüsselwort „wait“ markiert den Ort, an dem die Aufgabenausführung fortgesetzt wird. Daher finden Sie dieses Schlüsselwort immer im Zusammenhang mit der Aufgabe.
Nachfolgend finden Sie eine überarbeitete Version des zuvor besprochenen Codes, in der wir „async“ und „await“ anwenden. Alle anderen Schritte bleiben wie oben beschrieben, aber „Schritt 3“ wird ausgeführt, nachdem „Schritt 2“ abgeschlossen ist. Einfach ausgedrückt kehrt die Steuerung nach Abschluss der Aufgabe zur Method()-Methode zurück.
Nachdem Sie nun über „async“ und „await“ gelesen haben, möchte ich eine Frage stellen. Der obige Code kann auch über Task.Wait oder Task.ContinueWith implementiert werden. Was ist also der Unterschied zwischen ihnen? Ich überlasse Ihnen diese Frage als Hausaufgabe.
Zip ist eines der am häufigsten akzeptierten Dateiformate. Das Zip-Format wird von fast allen Betriebssystemen unter einigen integrierten Namen unterstützt.
In Windows-Betriebssystemen ist es unter dem Namen „Compressed File“ implementiert.
In MAC-Betriebssystemen ist es unter dem Namen „Document Utility“ implementiert.
Derzeit gibt es in .NET keine integrierte Unterstützung für die Durchführung der Zip-Komprimierung. Viele Entwickler nutzen Komponenten von Drittanbietern wie „DotnetZip“. In .NET 4.5 ist das Zip--Attribut in das Framework selbst integriert, integriert in den -Namespace von System.IO.Compression.
Im ersten Schritt müssen Sie auf die zwei Namespaces verweisen:
System.IO.Compression.FileSystem
System.IO.Compression
Als nächstes referenzieren Sie die folgenden zwei Namespaces:
using System.IO.Compression;
Wenn Sie Dateien aus einem Ordner komprimieren möchten, können Sie das folgende CreateFromDirectory aufrufen Funktion unten gezeigt.
ZipFile.CreateFromDirectory(@"D:\data",@"D:\data.zip");
Wenn Sie dekomprimieren möchten, können Sie die ExtractToDirectory-Funktion aufrufen, wie im folgenden Code gezeigt.
ZipFile.ExtractToDirectory(@"D:\data.zip", @"D:\data\unzip");
„Regulärer Ausdruck“ war schon immer die erste Wahl für Verifizierungsmethode. Wenn Sie mit regulären Ausdrücken noch nicht vertraut sind, sehen Sie sich den Abschnitt „Reguläre Ausdrücke“ an, in dem ich erkläre, wie reguläre Ausdrücke funktionieren. Aber gerade wegen der typischen logischen Analyse regulärer Ausdrücke sind sie DOS-Angriffen ausgesetzt. Versuchen wir zu verstehen, was ich gerade gesagt habe.
Betrachten Sie als Beispiel bitte diesen regulären Ausdruck – „^(d+)$“. Dieser reguläre Ausdruck gibt an, dass es nur Zahlen geben kann. Sie können auch das Symboldiagramm für reguläre Ausdrücke sehen, das zeigt, wie der reguläre Ausdruck ausgewertet wird. Nehmen wir nun an, dass wir „123456X“ verifizieren wollen. Dies wird 6 Pfade haben, wie im Bild unten gezeigt.
Aber wenn wir noch eine Zahl hinzufügen, ergeben sich 7 Pfade. Mit anderen Worten: Mit zunehmender Zeichenlänge dauert die Ausführung des regulären Ausdrucks länger. Das heißt, die Auswertungszeit skaliert linear mit der Zeichenlänge.
Nun ändern wir den zuvor definierten regulären Ausdruck von „^(d+)$“ in „^(d+)+$“. Wenn Sie sich das Regex-Notationsdiagramm ansehen, ist es ziemlich komplex. Wenn wir nun versuchen, „123456X“ zu verifizieren, ergeben sich 32 Pfade. Wenn Sie ein weiteres Zeichen hinzufügen, erhöht sich die Anzahl der Pfade auf 64.
Mit anderen Worten, der Zeitaufwand im obigen regulären Ausdruck hängt exponentiell von der Anzahl der Zeichen ab.
Nun fragen Sie sich vielleicht: Ist das wichtig? Die linear zunehmende Auswertungszeit kann von Hackern für DOS-Angriffe (Denial of Service) ausgenutzt werden. Sie können einen so langen String bereitstellen, dass Ihre Anwendung für immer hängen bleibt.
Eine geeignete Lösung für dieses Problem besteht darin, ein Timeout für die Ausführung regulärer Ausdrücke festzulegen. Die gute Nachricht ist, dass Sie in .NET 4.5 eine Timeout-Eigenschaft definieren können, wie im folgenden Code gezeigt. Wenn Sie also eine schädliche Zeichenfolge erhalten, wird die Anwendung nicht dauerhaft in der Schleife ausgeführt.
try { var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds(2)); var match = regEx.Match(“123453109839109283090492309480329489812093809x”); } catch (RegexMatchTimeoutException ex) { Console.WriteLine(“Regex Timeout”); }
Wir alle wissen, dass .NET-Code halb ist -kompiliertes Format. Zur Laufzeit führt der JIT-Compiler (Just-in-Time) diesen halbkompilierten IL-Code aus und konvertiert ihn in maschinennativen Code. Eine der größten Beschwerden über JIT besteht darin, dass eine .NET-Anwendung bei der ersten Ausführung sehr langsam läuft, da die JIT damit beschäftigt ist, IL-Code in Maschinencode umzuwandeln.
Um diese Startzeit zu verkürzen, gibt es in .NET4.5 eine sogenannte „Optimierungskonfigurationsdatei“. Eine Konfigurationsdatei ist nichts anderes als eine einfache Datei, die eine Liste von Methoden aufzeichnet, die Ihre Anwendung zum Starten benötigt. Wenn also die Anwendung gestartet wird, wird das Hintergrund-JIT ausgeführt und beginnt mit der Konvertierung des IL-Codes dieser Methoden in Maschinen-/Muttersprache.
Dieses Hintergrund-JIT kompiliert Startup-Methoden auf mehreren Prozessoren, um die Startzeit weiter zu verkürzen. Beachten Sie außerdem, dass Sie zur Profiloptimierung einen Mehrkernprozessor benötigen. Wenn Sie keinen Mehrkernprozessor haben, wird diese Einstellung ignoriert.
为了创建“配置文件”这个文件,首先你需要引入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。所以上述代码在这些技术中无需编写。
垃圾回收在.NET应用中是一项真正繁重的任务。当是ASP.NET应用的时候,它变得更繁重。ASP.NET应用在服务器运行,许多客户端向服务器发送请求从而产生对象负荷,使得垃圾回收确实努力清理不需要的对象。
在.NET4.0中,当垃圾回收运行清理的时候,所有的应用程序线程都暂停了。在上图中你可以看到我们有3个应用程序线程在执行。有两个垃圾回收运行在不同的线程上。一个垃圾回收线程对应一个逻辑处理器。现在应用程序线程运行并执行它们的任务,伴随着这些应用程序线程的执行它们也创建了操作对象。
在某个时间点,后台垃圾回收运行开始清理。当这些垃圾回收开始清理的时候,它们暂停了所有的应用程序线程。这使得服务器/应用程序在那一刻不响应了。
为了克服上述问题,服务器垃圾回收被引进了。在服务器垃圾回收机制中多创建了一个运行在后台的线程。这个线程在后台运行并持续清理2代对象(关于垃圾回收0,1和2代的视频)从而降低主垃圾回收线程的开销。由于双垃圾回收线程的执行,主应用程序线程很少被暂停,进而增加了应用程序吞吐量。为了使用服务器垃圾回收,我们需要使用gcServer XML标签并且将它置为true。
<configuration> <runtime> <gcserver></gcserver> </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面试问和答,我已经在这方面有了不少努力。
Das obige ist der detaillierte Inhalt von.NET Framework 4.5 teilt fünf großartige Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!