C#6 Nouveau répertoire de fonctionnalités
introduit une paire de mots-clés wait/async en C#5 pour prendre en charge le nouveau modèle de programmation asynchrone , rendant la programmation asynchrone C# Le modèle est encore simplifié (APM ->EAP->TAP->await/async. Le modèle de programmation asynchrone en C# n'est pas l'introduction de cet article. Pour des informations détaillées, veuillez vous rendre ici AsynchrModèle de programmation coûteux). Bien que wait/async ait été introduit en C#5, il comporte certaines restrictions. Par exemple, il ne peut pas être utilisé dans les blocs d'instructions catch et finy. Cette restriction ne s'appliquera plus en C#6.
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 }
Si vous faites attention, vous constaterez que
La couleur de cette ligne n'est pas le vert que j'ai défini, mais le blanc, et l'ordre est également dans le désordre si vous l'exécutez à nouveau, il se peut qu'il soit vert ; Ceci est en fait dû au fait que les deux lignes de code de ma méthode Log (méthode non thread sécurisée ) sont appelées par plusieurs threads :
1 Console.ForegroundColor = color;2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
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 }
Le code que nous avons écrit dans CallerMethod a été transféré vers Move Suivant
2. ExceptionFiltre
La section when est l'endroit où le filtre d'exception prend effet. When est suivi d'une
1 try { … }2 catch (Exception e) when (filter(e))3 {4 …5 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!