비동기 보이드, 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 이후 이 시나리오에서 비동기를 "불타고 잊는다"고 생각하는 것은 다소 잘못된 것이 아닌가요?넷은 실제로 그것을 잊지 않고 있습니까?
는 을 를 을 할 을 는 을 할 를 async
ASP로 이동합니다.NET. 그리고 그들은 그것을 그들의 "하나의 ASP" 모두에게 가져다 주기를 원했습니다.NET" - NET" - async
WinForms, 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 코어는 실제로 완성되지 않았다고 판단합니다.
이로 인해 두 가지 시나리오에서 문제가 발생할 수 있습니다.
- 당신은 도서관을 이용하려고 하는 것이거나 그것이 사용하지 않는 것입니다.
async void
할 합니다. 죄송하지만, 도서관이 고장이 나서 고쳐야 할 것 같습니다. - 은 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
'sourcetip' 카테고리의 다른 글
Laravel 5.1의 URL로 돌아가기 (0) | 2023.09.10 |
---|---|
Swift에서 목록의 배경색을 수정하는 방법UI? (0) | 2023.09.10 |
Upshot.js 예제 및 설명서는 어디서 찾을 수 있습니까? (0) | 2023.09.10 |
레이아웃에 공백 추가 (0) | 2023.09.10 |
큰 테이블에서 SELECT COUNT(0)가 느립니다. (0) | 2023.09.10 |