2017-09-20 7 views
0

최근에 나는 우리가 사용하고있는 코드를 통해 잘 작동하고 있으며 내 인생에서 그 이유를 알 수 없습니다.OwinCommunicationListener에서 호스팅되는 Async Web API의 Fire 및 Forget 메서드

OwinCommunicationListener를 통해 호스팅되는 서비스 패브릭 클러스터에서 호스팅되는 웹 API가 있습니다.

[HttpPost] 
public async Task<HttpResponseMessage> WebApiMethod(RequestObject request) 
{ 
    string test; 
    SomeObject obj; 
    .... 
    DoSomethingAsync(test, obj); 
    return this.ActionContext.CreateResponse(HttpStatusCode.OK, new { Status = "Success" }); 
} 


private async Task DoSomethingAsync(string param1, SomeObject param2) 
{ 
    ..... 
    await SomeOtherAsyncMethod(); 
    ..... 
} 

는 지금까지 내가 이해가 DoSomethingAsync의 방법 완료 및 해제 처분 이후 조기 완료 경우 TaskCancelledException 또는 뭔가를 던져해야하는 요구 사이의 경쟁 조건해야하지만하지 않았다.

DoSomething 작업이 기다리지 않고도 매 작업을 완료하기 때문에 약간의 오류가 예상됩니다. 추가 할 경우

await Task.Delay(10000); 

다음에 API 응답이 거의 즉각적으로 실행되고 나머지 10 초 후 코드가 실행됩니다. 원래 호출이 Fire-and-Forget (기다리지 않을) 이었기 때문에 그때까지는 호스트 스레드를 삭제하면 안됩니다.

여기에 무엇이 누락 되었습니까?

+0

이것은 나에게 불명확합니다. 왜 예외를 기대합니까? – Fildor

+1

ASP.Net의 화재 및 잊어 버림 방법은 거의 항상 끔찍한 생각입니다. 이런 종류의 일을 처리하기 위해 만들어진 라이브러리, 예를 들어 Hangfire를 사용해야합니다. 또는 당신이 Azure에있는 것처럼 보이기 때문에 WebJobs일지도 모르는 기능을 100 % 확신하지 않고이를 활용할 수 있습니까? – DavidG

+0

@fildor 나는 DoSomethingAsync 메서드를 기다리지 않고서도 어떻게 든 매시간 작업을 완료하지 못하기 때문에 예외가 예상됩니다. – goldsmit409

답변

0

DoSomethingAsync로 요청 개체를 연결하는 방법은 없습니다. 하지만 DoSomethingAsync에 RequestObj 참조를 전달하더라도 객체를 참조하는 동안 GC가 RequestObj를 수집하지 않으므로 메서드가 아무 문제없이 완료됩니다. 또한, 일단 비동기 실행이 시작되면, 다른 스레드에서 콜백이 완료 될 수 있지만 요청 처리 파이프 라인이 전달 된 콜백을 의미하는 자체 수명이 계속됩니다.