C#-Ausnahmeerweiterung

PHPz
Freigeben: 2017-03-12 15:45:50
Original
1251 Leute haben es durchsucht

0. Katalog

C#6 Neues Funktionsverzeichnis

1. In Catch und Finally Blocks Using waiting

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 }
Nach dem Login kopieren

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}");
Nach dem Login kopieren


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 }
Nach dem Login kopieren

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

Tatsächlich wird diese Sprachfunktion schon seit langem in VB und F# unterstützt und kann nun auch in C# verwendet werden 6.


Im Abschnitt „Wann“ wird der Ausnahmefilter wirksam, wenn ein

Ausdruck
1 try { … }2 catch (Exception e) when (filter(e))3 {4     …5 }
Nach dem Login kopieren
folgt Geben Sie den aktuellen Catch-Anweisungsblock ein.

3. Referenz

Asynchrone Programmiermuster

C# 6.0 wartet in Catch/finally

C# 6.0 Ausnahmefilter

http:/ / /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!

Verwandte Etiketten:
c#
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage