新しい非同期 プログラミングをサポートするためのキーワードのペアの導入 モデル は、C# の非同期プログラミング モデル (APM->EAP->TAP->await/async) をさらに簡略化します。C# の非同期プログラミング モデルは、この記事の一部ではありません。 はじめに キー ポイント、詳細情報こちらにアクセスしてください。Asynchronousプログラミングパターン)。 await/async は C#5 で導入されましたが、catch および finally ステートメント ブロックでは使用できないなど、いくつかの制限があります。この制限は 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 }
実行結果は次のとおりです:
注意して見ると、async メソッド begin:6 の色は実際には私が設定した緑ではなく白であることがわかります。順序も乱れており、再度実行すると緑色になる可能性があります。これは実際には、私の Log メソッド (非スレッド safe メソッド) の 2 行のコードが複数のスレッドによって呼び出されていることが原因です。 (C# でこれを行う方法はたくさんありますが、これはそのうちの 1 つにすぎません):
1 Console.ForegroundColor = color;2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
少し話が逸れているようですが、本題に戻り、catch およびfinally ステートメント ブロックで await キーワードをサポートします。 IL 命令は必要ありません。 サポートは CLR サポートを必要としませんが、コンパイラーによって行われる単なるコード変換です (await/async はデリゲートするラムダのようなものです)。特定の IL については説明しません。大きすぎるため、一般的な状況を示す図を以下に示します。
CallerMethod で作成したコードは Move
Nextに転送されました (詳細については、ブログをご覧ください)モバイル ガーデンの友人「Dev_Eric」による: 高度な記事: IL を剣として使用し、async/await を直接指す) (catch とfinally の await ステートメントを含む)。
2. 例外実際、この言語機能は VB と F# で長い間サポートされており、現在は C#6 でも使用できるようになりました。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 }
when ブロックは、例外フィルターが有効になる場所です。 when の後に
expression が続きます。式の結果が true の場合、現在の catch ステートメント ブロックに入ります。
以上がC# 例外の強化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。