2012-03-09 2 views
13

비동기 적으로 검색 한 다음보기를 반환하는 비동기 경로와 단순보기를 반환하는 동기 경로라는 두 가지 경로가있는 검색 동작이 있습니다. 둘 다 GET 요청이므로 동일한 작업을 수행합니다.비동기 작업을 사용하여 동기 코드 실행

문제는 "localhost : XXXX/Home/Search"작업에 액세스 할 때 페이지가 무한히로드된다는 것입니다. Fiddler를 사용하면 요청이 결코 반환되지 않음을 알 수 있습니다. 내가 그것을 디버깅하고 코드의 마지막 줄에 있지만, 다시 요청이 완료되지 않습니다.

나는 다음에 생식을 단순화했습니다 :

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 

VS11 코드가 잘 인 기다리고 있습니다없이 동 기적으로 실행됩니다 저를 경고하지만, 요청이 완료되지 않습니다.

이 기능을 사용해야합니까? 아니면 여기서 다른 것을해야합니까?

편집

이 .NET 4.5을 대상으로 MVC 4입니다.

public async Task<ActionResult> Search(string query = null) 
{ 
    if (string.IsNullOrWhiteSpace(query)) 
     return View(new SearchViewModel()); // never loads 

    var model = await _someService.SearchAsync(query); 
    return View(model); // loads 
} 
+0

나는 * 작동해야한다고 생각하지만, 어떤 이유로하지 않습니다. 내부적으로'NullReferenceExcpetion'을 던지고 잡는 것이므로 버그라고 생각합니다. – svick

+1

팁 : 액션 메소드가'Task '을 반환하면'Controller'가 아니라'AsyncController'를 상속 받아야합니다. – vcsjones

+0

2 @ vcsjones, 나는 그것을 시도했지만 도움이되지 않습니다. 그리고 [그것은 MVC4에서 필요하지 않아야합니다] (http://msdn.microsoft.com/en-us/library/system.web.mvc.asynccontroller%28v=vs.108%29.aspx). – svick

답변

16

이 베타에서 알려진 버그 : 내가 비동기 행동에 동기가 필요한 이유

편집 나은 코드에서 사물을하는 사람들을 위해 2

이입니다. To quote Stephen Toub:

짧은 대답 비동기 방식 동기 완료하면이 문제를 초래 .NET 4.5 베타 ASP.NET MVC에서 이미 알려진 문제가 있다는 것이다. 수정이 가능해질 때까지 간단한 해결 방법은 "await Task.Yield();"를 추가하는 것입니다. async 메서드의 첫 번째 행으로 비동기 적으로 완료되도록합니다. 구성의 appSettings는 섹션에

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 

:이 제대로 작동하려면, 당신은 또한 당신이 선을 보장하는 의미 .NET 4.5에서 ASP.NET에서 제공하는 새로운에서 SynchronizationContext를 사용하고 확인해야합니다 파일.

관련 문제