2013-10-24 3 views
17

을 내가 ASP.NET MVC 5 템플릿을보고 있었고, 난은 예고가 그 행동의 많은 및 비동기로 표시 :비동기 작업 방법

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { } 

내가 MVC 액션에이 작업을 수행해야합니까? 데이터베이스에 대한 액세스가 포함되어 있습니까?

작업 내에서 저장소를 호출해도 태스크를 사용하여 비동기로 만들어야합니까?

답변

11

질문의 핵심은 다음과 같습니다. 언제 MVC 작업을 비동기로 만들어야합니까? 문제에 대한 좋은 설명은 http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx을 참조하십시오. 그는 데이터베이스에 대해서만 말하지만, 그의 포인트는 계속됩니다.

기본적으로 데이터베이스를 비동기 방식으로 호출하지 마십시오. 웹 서버에서 차단 된 스레드의 수를 줄이기 위해 비동기 작업을 사용하여 데이터베이스 응용 프로그램

은 거의 항상 시간의 낭비 입니다.

가능하면 항상 비동기 IO를 사용하라는 말을 듣지 마십시오. 비동기는 지금 모든 분노입니다. 무리한 비논리적 조언이 퍼지고 있습니다.

+2

2012 년 11 월 28 일부터 언급 된 기사가 변경 될 예정입니다. "await, async 및 Task 객체를 조합하면 .NET 4.5에 비동기 코드를 작성하는 것이 훨씬 쉬워졌습니다. 이제 EF 6 비동기 쿼리 및 저장을 지원하는 경우 비동기 프로그래밍을 활용해야합니다. " –

+1

@ PaulHatcher 나는 그 결론에 전혀 동의하지 않습니다. 이 주제에 관한 다른 자료 : http://stackoverflow.com/a/25087273/122718 및 http://stackoverflow.com/a/12796711/122718. 커뮤니티 전체가 새로운 멋진 기술로 뛰어 드는 경우 아무도 정말로 왜 그런지 말하면 아무 것도 묻지 말아야합니다. – usr

9

Entity Framework 6 (기본적으로 MVC 5에서 사용됨)은 이제 비동기 데이터베이스 호출을 지원하므로 비동기 사용을 반영하기 위해 동작 메서드 서명이 업데이트되었습니다. 간단한 대답은 잠재적으로 대기를 포함 할 수있는 작업이있을 때마다 비동기를 사용한다는 것입니다. 다행히도 데이터베이스 쿼리는 왕복 시간이 길어서 실제로 비동기로 인해 많은 이익을 얻을 수 없지만 데이터베이스가 망가 졌거나 특히 충격을 받으면 적어도 프로세스에서 IIS를 교착 상태로 만드는 데 도움이됩니다.

+0

이 조언에는 설명이 필요합니다. – usr

+0

@usr : 어떤 정당성을 찾고 계십니까? 그 정당성은 이미 있습니다. 데이터베이스 서버가 어떤 이유로 든 요청에 ​​응답하는 데 특히 긴 시간이 걸리면 IIS가 추가 요청을 처리 할 수있는 호흡 공간을 제공합니다. 비동기의 본질은 쓰레드가 대기 상태에있는 동안 풀에 반환되어 잠긴 상태로 앉아있는 대신 다른 작업을 수행하여 작업이 완료 될 때까지 기다릴 수 있음을 의미합니다. –

+1

DB가 평균 10ms로 응답하고 10 초가 걸리면 원하는 모든 스레드를 반환 할 수 있습니다. 앱이 다운되었습니다. 스레드는 ASP.NET에서 부족하지 않습니다. 기본적으로 수백 가지가 있으며 많은 공통 요청으로 인해 일반적인 DB가 도움이되지 않습니다. 비동기 DB 호출의 경우가 약합니다. – usr

5

여기에는 작업을 사용하면 몇 가지 유스 케이스가 나열되고 유익한 경우가 있으며 어떤 경우에는 반대 효과가있는 경우가 있습니다 ( ). 대답은 매번 간단하지 않습니다. 이것이 테스트에 관한 마지막 부분입니다. 일반적 http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

에서

견적 다음 조건 동기 방법을 사용

  • 동작은 단순 또는 단기 실행한다.
  • 효율성보다 단순성이 중요합니다.
  • 작업은 주로 디스크 또는 네트워크 오버 헤드가 많은 작업 대신 CPU 작업입니다. CPU 바인딩 작업에 비동기 작업 메서드를 사용하면 아무런 이점이 없으며 결과가 더 많은 오버 헤드를 초래합니다. 일반적으로

, 다음과 같은 조건에 대한 비동기 방법을 사용 : 당신은 비동기 방법을 통해 소비 할 수있는 서비스를 호출하고, 당신이 .NET 4.5 이상을 사용하고

  • .
  • 작업은 CPU 바인딩 대신 네트워크 바인딩 또는 I/O 바인딩입니다.
  • 병렬 처리가 코드 단순성보다 중요합니다.
  • 장기 실행 요청을 취소 할 수있는 메커니즘을 제공하려고합니다.
  • 스레드를 전환하는 이점은 컨텍스트 전환 비용에 비중을 둡니다. 일반적으로 작업을 수행하는 동안 동기화 메서드가 ASP.NET 요청 스레드에서 대기하는 경우 비동기 메서드를 만들어야합니다. 비동기 호출을함으로써 ASP.NET 요청 스레드 은 웹 서비스 요청이 완료되기를 기다리는 동안 아무런 작업을하지 않아도 멈추지 않습니다.
  • 테스트 결과 차단 작업이 사이트 성능의 병목 현상이며 IIS는 이러한 차단 호출에 대해 비동기 메서드를 사용하여 더 많은 요청을 처리 할 수 ​​있음을 보여줍니다.