대리자와 비동기 대리자를 사용하는 기존 C# "fire-and-forget" 비동기 작업은 기본 스레드를 차단하지 않고 작업을 실행합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!