メインから非同期メソッドを直接呼び出す: 総合ガイド
C# に導入された重要な機能強化の 1 つは、async/await パターンです。非同期操作の開発が簡素化されます。ただし、Main() から非同期メソッドを直接呼び出すのは少し難しい場合があります。
問題を理解するには、次のコード サンプルを検討してください。
public class test { public async Task Go() { await PrintAnswerToLife(); Console.WriteLine("done"); } public async Task PrintAnswerToLife() { int answer = await GetAnswerToLife(); Console.WriteLine(answer); } public async Task<int> GetAnswerToLife() { await Task.Delay(5000); int answer = 21 * 2; return answer; } }
Go メソッドを呼び出そうとした場合Main() から次のようにします:
class Program { static void Main(string[] args) { test t = new test(); t.Go().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); }); Console.ReadKey(); } }
デッドロック状況が発生し、出力が
解決策は、Main() を変更してそれ自体を非同期メソッドにすることです。 7.1 以降の C# バージョンの場合:
static async Task Main(string[] args) { test t = new test(); await t.Go(); Console.WriteLine("finished"); Console.ReadKey(); }
このアプローチにより、メイン スレッドをブロックすることなく、非同期操作をシームレスに実行できます。
以前のバージョンの C# を使用している場合では、次のコードを使用できます:
static void Main(string[] args) { test t = new test(); t.Go().Wait(); Console.WriteLine("finished"); Console.ReadKey(); }
ここで、Wait() メソッドは、メイン スレッドを明示的にブロックします。 Go メソッドが完了します。
async/await パターンを採用すると、コールバックの複雑さを回避でき、その結果、非同期操作のコードがよりクリーンで保守しやすくなることに注意してください。
以上がC# で Main メソッドから非同期メソッドを正しく呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。