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
méthode asynchrone début : 6La 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
(Pour des informations plus détaillées, veuillez visiter le blog de l'ami du jardin "Dev_Eric" : Avancé : Utiliser IL comme une épée, pointant directement vers async/await) (y compris les instructions wait dans catch et enfin ).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!