C#6 Neues Funktionsverzeichnis
führt ein Schlüsselwortpaar „await/async“ in C#5 ein, um das neue asynchroneProgrammiermodell zu unterstützen und so die asynchrone Programmierung in C# zu ermöglichen. Das Modell wird weiter vereinfacht ( APM->EAP->TAP->await/async. Das asynchrone Programmiermodell in C# steht nicht im Mittelpunkt dieses Artikels. Ausführliche Informationen finden Sie hier: Asynchronous Programmiermuster). Obwohl „await/async“ in C#5 eingeführt wurde, gibt es einige Einschränkungen. Beispielsweise kann es nicht in Catch- und Finy-Anweisungsblöcken verwendet werden. Diese Einschränkung gilt nicht mehr in C#6.
Die Laufergebnisse sind wie folgt:
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace csharp6 6 { 7 internal class Program 8 { 9 private static void Main(string[] args)10 {11 do12 {13 Log(ConsoleColor.White, "caller method begin", true);14 CallerMethod();15 Log(ConsoleColor.White, "caller method end");16 } while (Console.ReadKey().Key != ConsoleKey.Q);17 }18 19 public static async void CallerMethod()20 {21 try22 {23 Log(ConsoleColor.Yellow, "try ", true);24 throw new Exception();25 }26 catch (Exception)27 {28 Log(ConsoleColor.Red, "catch await begin", true);29 await AsyncMethod();30 Log(ConsoleColor.Red, "catch await end");31 }32 finally33 {34 Log(ConsoleColor.Blue, "finally await begin", true);35 await AsyncMethod();36 Log(ConsoleColor.Blue, "finally await end");37 }38 }39 40 private static Task AsyncMethod()41 {42 return Task.Factory.StartNew(() =>43 {44 Log(ConsoleColor.Green, "async method begin");45 Thread.Sleep(1000);46 Log(ConsoleColor.Green, "async method end");47 });48 }49 50 private static void Log(ConsoleColor color, string message, bool newLine = false)51 {52 if (newLine)53 {54 Console.WriteLine();55 }56 Console.ForegroundColor = color;57 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");58 }59 }60 }
Wenn Sie vorsichtig sind, werden Sie das findenasync method begin: 6
Die Farbe dieser Zeile ist nicht das von mir festgelegte Grün, sondern weiß, und die Reihenfolge ist auch nicht in Ordnung, wenn Sie sie erneut ausführen. Dies wird tatsächlich dadurch verursacht, dass die beiden Codezeilen in meiner Log-Methode (nicht-threadsichere-Methode ) von mehreren Threads aufgerufen werden:
Wir können einige kleine Änderungen vornehmen, um die Log-Methode threadsicher zu machen (es gibt viele Möglichkeiten, dies in C# zu tun, dies ist nur eine davon):
1 Console.ForegroundColor = color;2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
Es scheint ein wenig abseits des Themas zu sein, zurück zum Thema: Die Unterstützung des Schlüsselworts „await“ in den Anweisungsblöcken „catch“ und „finally“ erfordert weder die Unterstützung der IL-Anweisung noch die Unterstützung der CLR, sondern ist lediglich die von durchgeführte Codekonvertierung der Compiler (await /async ist wie Lambda zum Delegieren). Ich werde nicht näher auf die spezifische IL eingehen, sie ist zu groß, um die allgemeine Situation zu sehen:
1 [MethodImpl(MethodImplOptions.Synchronized)] 2 private static void Log(ConsoleColor color, string message, bool newLine = false) 3 { 4 if (newLine) 5 { 6 Console.WriteLine(); 7 } 8 Console.ForegroundColor = color; 9 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");10 }
Der Code, den wir in CallerMethod geschrieben haben, wurde an Move übertragen Weiter
(Für detailliertere Informationen besuchen Sie bitte einen Blog von Gartenfreund „Dev_Eric“: Fortgeschritten: IL als Schwert verwenden, direkt auf async/await zeigen) (einschließlich der Wait-Anweisungen in „catch“ und „final“).2. AusnahmeFilter
Im Abschnitt „Wann“ wird der Ausnahmefilter wirksam, wenn ein
1 try { … }2 catch (Exception e) when (filter(e))3 {4 …5 }
Das obige ist der detaillierte Inhalt vonC#-Ausnahmeerweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!