sourcetip

비동기 보이드, ASP.순 및 미결 작업 수

fileupload 2023. 9. 10. 12:30
반응형

비동기 보이드, ASP.순 및 미결 작업 수

저는 ASP에서 비동기 방식을 사용하는 이유를 이해하려고 합니다.넷 애플리케이션은 다음 예외를 발생시킬 수 있지만 비동기 작업은 발생하지 않는 것으로 나타납니다.

System.InvalidOperationException: An asynchronous module or handler 
completed while an asynchronous operation was still pending

저는 비동기의 세계에 비교적 익숙하지 않습니다.NET이지만, 다음과 같은 모든 리소스를 포함하여 기존 리소스를 통해 이 문제를 해결하려고 한 것처럼 느껴집니다.

이러한 리소스를 통해 일반적으로 작업을 반환하고 비동시를 방지하는 것이 최선의 방법임을 알고 있습니다.또한 메서드가 호출되면 비동기식으로 미결 작업 수가 증가하고 메서드가 완료되면 감소한다는 것도 알고 있습니다.이것은 적어도 제 질문에 대한 답의 일부처럼 들립니다.하지만 제가 놓치고 있는 것은 제가 태스크를 반환할 때 어떤 일이 일어나고 왜 그렇게 하면 일이 "통하게" 되는지 입니다.

다음은 제 질문을 좀 더 자세히 설명하기 위한 작위적인 예입니다.

public class HomeController : AsyncController
{
    // This method will work fine
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Do not await the task since it is meant to be fire and forget
        var task = this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // This method will throw the following exception:
    // System.InvalidOperationException: An asynchronous module or 
    // handler completed while an asynchronous operation was still pending
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        // Obviously can't await a void method
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

이와 관련하여, 비동기에 대한 저의 이해가 맞다면, ASP 이후 이 시나리오에서 비동기를 "불타고 잊는다"고 생각하는 것은 다소 잘못된 것이 아닌가요?넷은 실제로 그것을 잊지 않고 있습니까?

는 을 를 을 할 을 는 을 할 를 asyncASP로 이동합니다.NET. 그리고 그들은 그것을 그들의 "하나의 ASP" 모두에게 가져다 주기를 원했습니다.NET" - NET" - asyncWinForms, MVC, WebAPI, SignalR 등을지원합니다.

역사적으로 ASP.NET은 이후 클린 비동기 작업을 지원했습니다. Pattern 2, 요소는 EAP(Event-based Asynchronous Pattern)를 합니다. NET 2.0.SynchronizationContext . . . . . . . . . . . . . . . . . . . . . . . . . .NET 4.5는 이 지원에 처음으로 상당히 큰 변화를 가져오며 핵심 ASP를 업데이트합니다. 기반 패턴( Pattern즉 TAP)을더 잘 활성화하기 위한 입니다.async).

한편, 각 프레임워크(WebForms, MVC 등)는 모두 하위 호환성을 우선 순위로 유지하면서 해당 코어와 상호 작용할 수 있는 자체적인 방법을 개발했습니다.핵심 ASP.NET은 개발자를 지원하기 위한 시도로,SynchronizationContext이 기능은 사용자가 볼 수 있는 예외 기능을 통해 향상되었습니다. 많은 사용 오류를 파악할 수 있습니다.

에서는 WebForms 에서, 을 합니다.RegisterAsyncTask하지만 많은 사람들은 그냥async void이벤트 핸들러를 대신합니다.그래서 ASP.NET.SynchronizationContext허락할 것입니다async void페이지 수명 주기 중 적절한 시간에 사용하면 해당 예외가 발생합니다.

MVC/WebAPI/SignalR 세계에서 프레임워크는 서비스로서 더 구조화되어 있습니다.그래서 그들은 입양을 할 수 있었고,async Task아주 자연스러운 방식으로, 그리고 그 틀은 단지 반환되는 것을 처리하기만 하면 됩니다.Task매우 추상화 - 으로 ②, ③이 .AsyncController 이상;더상지는로를는다고을이는a다고을t는ete는로m;st더s'msn;상cs를caTask.

하지만, 만약 당신이 a를 돌려주려고 한다면,Task 사용.async void지원되지 , .이를 지원할 이유가 거의 없습니다. 어차피 그렇게 해서는 안 되는 사용자를 지원하는 것만으로도 상당히 복잡할 것입니다.그 것을 기억하라.async void코어 ASP.NET에 알립니다.SynchronizationContext직접적으로 MVC 프레임워크를 완전히 우회합니다.는 MVC는는을다을의을 기다리는 합니다.Task하지만 그것은 심지어 그것에 대해서도 알지 못합니다.async void, ASP에 완료를 반환합니다.NET 코어는 실제로 완성되지 않았다고 판단합니다.

이로 인해 두 가지 시나리오에서 문제가 발생할 수 있습니다.

  1. 당신은 도서관을 이용하려고 하는 것이거나 그것이 사용하지 않는 것입니다.async void 할 합니다. 죄송하지만, 도서관이 고장이 나서 고쳐야 할 것 같습니다.
  2. 은 EAP 를 으로 하는 입니다 의 입니다 하는 으로 의 를 은 Task그리고 적절하게 사용하는.await 요소가 .EAP 하기 에 가 할 과 가 할 가 .SynchronizationContext∙. 이할 수 이 가장 TAP Type 으로 Type 대체하는 Type 해결책입니다 Type Type 좋은 Type 가장 Type 것이 직접적으로 수정하거나 있도록 경우 지원자연스럽게 :HttpClient에 대신에WebClient그렇지 않으면 TAP-over-EAP 대신 TAP-over-APM을 사용할 수 있습니다.둘 다 가능하지 않다면 그냥 사용하면 됩니다.Task.Run당신의 TAP-over-EAP 포장지 주위에.

"불타고 잊어버리기"와 관련하여:

나는 개인적으로 이 문구를 사용하지 않습니다.async void⑤. 은 " 잊는다이 가장 합니다. 농담 으로 ⑥, ⑦, 오류불타고 확실히 잊어버려 라는 않습니다 문구어울리지 의미론우선 다루는 방법들 않습니다 " 잊어버려 어울리지 to 라는 문구방법들 - for the j refer most handling semantics , thing one certainly do error oking ly i fit 우선 not 농담 반으로 언급합니다.async void"화재와 충돌"과 같은 방법들입니다.참.async" forget"는 "fire and forget"일async Task된을는법e을 무시하는 방법Task기다리기 보다는.

그건 ASP에서.NET은 거의 요청에서 일찍 돌아오기를 원하지 않습니다(이것이 "불타오르거나 잊는다"는 의미입니다).이 답변은 이미 너무 길지만 블로그에 ASP를 지원하기 위한 코드와 함께 문제에 대한 설명이 있습니다.NET이 정말로 필요하다면 "불을 지피고 잊어버려라".

언급URL : https://stackoverflow.com/questions/17659603/async-void-asp-net-and-count-of-outstanding-operations

반응형