4

내가 ASP를 MVC 3 일하고, 내 응용 프로그램과 같은 몇 가지 방법으로 비동기 컨트롤러를 만들었습니다ASP를 MVC와 웹 API 광고 비동기 컨트롤러

public Task<HttpResponseMessage> PostActionAsync() 
{ 
    return Task<HttpResponseMessage>.Factory.StartNew(() => 
      { 
       var result = GetSomeResult(); 
       return Request.CreateResponse(HttpStatusCode.Created, result); 
      }); 
} 

는 다음과 같이 웹 API에서 비동기 작업을 만들 수있는 좋은 아이디어는 그것을 아니면 더 좋은 방법은 존재가 :처럼 나는 그것의 현재 시간에서 MVC 3에서와 같이 비동기 행동과 컨트롤러를 만드는 데 필요한 API를 본다?

UPD. 또한, 내가 사용할 경우

public async Task<HttpResponseMessage> ActionAsync() 
{ 
    var result = await GetSomeResult(); 
    return Request.CreateResponse(HttpStatusCode.Created, result); 
} 

이 전체 작업은 백그라운드 스레드에서 작동합니까? 내 GetSomeResult() 기능을 기다리는 방법은 무엇입니까? Task<HttpResponseMessage>이 (가) 기다리는 것은 아닙니다.

답변

2

ActionAsync 메서드가 호출 된 후 기본적으로 클라이언트를 해제하는 MVC 3의 원래 동작과 큰 차이가 있습니다 (클라이언트 스레드가 해제되고 이후에 ActionCompleted 동작을 호출하여 결과를 가져와야 함) . 그게 당신이 찾고있는 경우, 당신은 클라이언트 측에서 작업과 비동기 코드를 구현해야합니다.

두 번째 버전은 서버 코드를 비동기로 만드는 것이지만 클라이언트 스레드는 응답을 동 기적으로 기다립니다. getResult는 GetResult 메서드가 무언가를 반환 할 때까지 서버 스레드가 ASP.NET 스레드 풀로 돌아가도록하여 스레드가 다른 요청과 함께 재사용 될 수 있도록합니다. 그것은 배경 작업과 관련이 없습니다. Fire and forget 접근 방식을 사용하려면 Task.Factory.StartNew (() => your code) 또는 ThreadPool.QueueUserWorkItem (() => your code)을 사용해야합니다.

+0

행동은 어땠 을까? 나는이 http://pastebin.com/NeRKfqDp를 사용하려고 시도했다. 그리고 나의 모든 'POST'쿼리는 "404"를 리턴한다. –

+0

Factory.StartNew는 추가 스레드를 회전시킬 때 그 컨텍스트에서 확실히 틀리다. 스레드 풀에서 작업) 현재 현재 요청을 처리하는 스레드 외에. EventModel.PrepareModel이 작업을 반환합니까? –

+0

'EventModel.PrepareModel'은 void 함수입니다. 그래서, 'Factory.StartNew'가 잘못 되었다면 비동기 요청을하기 위해 무엇을 사용해야합니까? –