ASP.NET MVC 비동기 메서드에서 Fire-and-forget을 안전하게 처리
ASP.NET 애플리케이션에서는 "실행 후 삭제" 접근 방식이 일반적으로 권장되지 않지만 완료될 때까지 기다리지 않고 비동기 메서드를 호출해야 하는 상황이 있을 수 있습니다. 그러나 실행 후 잊어버리는 방식으로 비동기식 메서드를 실행하면 특정 위험과 제한 사항이 발생합니다.
한 가지 위험은 비동기 메서드에서 처리되지 않은 예외가 눈에 띄지 않고 예상치 못한 동작으로 이어질 수 있다는 것입니다. 이 문제를 해결하려면 TaskScheduler.UnobservedTaskException
이벤트를 구독하여 예외를 기록하고 이로 인해 애플리케이션이 중단되는 것을 방지하는 것이 좋습니다.
또 다른 옵션은 다음과 같이 비동기 메서드에서 예외를 처리하는 래퍼 메서드를 만드는 것입니다.
<code class="language-csharp">private async Task DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception ) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
하지만 각 비동기 메서드를 try-catch 블록으로 래핑하면 장황하고 반복적일 수 있다는 점에 유의하세요.
또 다른 접근 방식은 ASP.NET 런타임을 사용하여 비동기 작업을 등록하는 것입니다. Scott Hanselman의 BackgroundTaskManager
라이브러리를 사용하면 작업을 동시에 실행하고 중앙에서 예외를 기록할 수 있습니다.
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
이 메서드는 작업을 런타임에 등록하여 ASP.NET 요청이 완료된 후에도 예외를 포착하면서 작업을 계속 실행할 수 있도록 합니다.
마지막으로 예외 처리 없이 실행 후 잊어버리는 방식으로 비동기 메서드를 실행해야 하는 경우 Task.Run()
를 사용하여 비동기 작업을 위한 새 스레드를 만들 수 있습니다.
<code class="language-csharp">Task foo = Task.Run( () => DeleteFooAsync() );</code>
그러나 Fire-and-forget은 처리되지 않은 예외의 잠재적인 결과를 허용할 수 있는 경우에만 사용해야 한다는 점을 기억하는 것이 중요합니다.
위 내용은 ASP.NET MVC에서 'Fire and Forget' 비동기 메서드를 안전하게 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!