이 질문 후에 ASP.NET MVC에서 비동기 작업을 사용할 때 편안합니다. 그래서 나는 그것에 대해 두 개의 블로그 게시물을 썼습니다.
ASP.NET MVC의 비동기 작업에 대한 오해가 너무 많습니다.
항상이 문장을 듣습니다. 작업이 비동기 적으로 실행되면 응용 프로그램의 확장 성이 향상 될 수 있습니다
그리고 이런 종류의 문장도 많이 들었습니다. 대량의 트래픽이있는 경우 쿼리를 비동기 적으로 수행하지 않는 것이 좋습니다. 하나의 요청을 처리하기 위해 2 개의 추가 스레드를 소비하면 다른 들어오는 요청에서 리소스가 제거됩니다.
나는이 두 문장이 일치하지 않는다고 생각합니다.
스레드 풀이 ASP.NET에서 작동하는 방법에 대한 많은 정보는 없지만 스레드 풀의 크기가 스레드에 대해 제한된다는 것을 알고 있습니다. 따라서 두 번째 문장은이 문제와 관련이 있습니다.
그리고 ASP.NET MVC의 비동기 작업이 .NET 4의 ThreadPool에서 스레드를 사용하는지 알고 싶습니다.
예를 들어 AsyncController를 구현할 때 앱은 어떻게 구성됩니까? 트래픽이 많은 경우 AsyncController를 구현하는 것이 좋습니다.
ASP.NET MVC 3 (NET 4)의 비 동시성에 대한 거래를 설명 할 수있는 사람이 있습니까?
편집하다:
나는이 문서를 거의 수백 번 읽었으며 주요 거래를 이해하지만 여전히 일관성이없는 의견이 많기 때문에 혼란 스럽습니다.
편집하다:
아래와 같은 컨트롤러 동작이 있다고 가정 해 봅시다 ( AsyncController
그러나 구현은 아님).
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
당신이 여기에서 볼 수 있듯이, 나는 작업을 시작하고 잊어 버렸습니다. 그런 다음 완료되기를 기다리지 않고 즉시 돌아옵니다.
이 경우 스레드 풀의 스레드를 사용해야합니까? 그렇다면 완료 후 해당 스레드는 어떻게됩니까? 합니까이 GC
오고가 완료 직후 청소?
편집하다:
@Darin의 답변을 위해 데이터베이스와 통신하는 비동기 코드 샘플이 있습니다.
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}