Heim >Backend-Entwicklung >C#.Net-Tutorial >C#-Ausnahmeerweiterung
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
-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
2. AusnahmeFilter
Im Abschnitt „Wann“ wird der Ausnahmefilter wirksam, wenn ein
1 try { … }2 catch (Exception e) when (filter(e))3 {4 …5 }folgt Geben Sie den aktuellen Catch-Anweisungsblock ein. Asynchrone ProgrammiermusterC# 6.0 wartet in Catch/finallyC# 6.0 Ausnahmefilterhttp:/ / /www.php.cn/
Das obige ist der detaillierte Inhalt vonC#-Ausnahmeerweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!