従来の C# の「ファイア アンド フォーゲット」非同期操作では、デリゲートと非同期デリゲートを使用して、メイン スレッドをブロックすることなくタスクを実行します。 async
/await
の導入により、このアプローチが改善されます。
古い方法と新しい方法を比較してみましょう:
<code class="language-csharp">// Old approach Action<string> asyncAction = DoIt; asyncAction.BeginInvoke("Test", ar => { asyncAction.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null); Console.WriteLine("Old-style main thread finished"); // New approach DoIt2("Test2"); Console.WriteLine("New-style main thread finished");</code>
どちらも同じ結果が得られますが、async
/await
を使用するとプロセスが簡素化され、EndInvoke
や手動でハンドルを閉じる必要がなくなります。 ただし、特定のシナリオでは await Task.Yield();
が必要になる場合があります。
これらのメソッド間のパフォーマンスの違いは無視できます。 async
/await
の主な利点は、リソース管理の改善にあります。クリーンアップを自動的に処理し、手動ハンドル管理に伴うリソース リークのリスクを排除します。
コードを変更せずに同期メソッド A()
を非同期で実行するには、それを非同期メソッド内でラップします。
<code class="language-csharp">public static async Task<TResult> InvokeAsync<TResult>(Func<TResult> action) { return await Task.Run(action); }</code>
ラッパーを呼び出します:
<code class="language-csharp">var task = InvokeAsync(A);</code>
async void
async void
メソッドは例外処理が複雑であるため、使用しないことをお勧めします。 上記の Task
ベースのアプローチは、潜在的なエラーを処理するための、より堅牢で管理しやすいソリューションを提供します。
以上が新しい Async/Await 構文は C# の Fire-and-Forget 操作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。