2014-09-26 3 views
2

MV5에서 비동기 작업을 올바르게 사용하는 방법이 무엇인지 모르겠습니다.MVC 5의 비동기 작업

어느 것을 사용해야하는지 잘 모릅니다.

이 :

public async Task<ActionResult> Index(CancellationToken ct) 
{ 
    var result = await service.GetData(ct); 
    return View(result); 
} 

이 :

public async Task<ActionResult> Index(CancellationTokenSource cts) 
{ 
    var result = await service.GetData(cts.Token); 
    return View(result); 
} 

또는이 :

public async Task<ActionResult> Index() 
{ 
    var cts = CancellationTokenSource.CreateLinkedTokenSource(Request.TimedOutToken, Response.ClientDisconnectedToken); 

    var result = await service.GetData(cts.Token); 
    return View(result); 
} 

그들 사이의 차이점은 무엇입니까?

+0

ASP.NET MVC 동작의 매개 변수로 CancellationToken 또는 CancellationTokenSource를 전달하는 이유를 알지 못합니다. –

+0

나도 마찬가지! 하지만이 일을 몇 가지 예제를 발견하고 거기에 "왜"... – user3900456

+0

두 번째도 실행합니까? –

답변

3

첫 번째 예는 MVC에서 CancellationToken을 전달합니다. 제가 믿는 두 번째 예는 전혀 작동하지 않을 것입니다. 세 번째 예제는 ASP.NET에서 두 개의 CancellationToken을 가져 와서 결합합니다.

아마도 AsyncTimeoutAttribute과 함께 첫 번째 예제를 사용해야합니다. AFAIK, Response.ClientDisconnectedToken 버그가있어 프로덕션 코드에서 사용되지 않습니다.

"이유"가 해결되면 요청을 취소 할 수 있습니다 (예 : 너무 오래 진행된 경우). 동기 메서드를 사용하면 ASP.NET은 요청에 할당 된 스레드 인 Thread.Abort을 방금 처리합니다. 비동기 메서드를 사용하면 ASP.NET이 더 멋지게되어 취소 토큰 만 설정됩니다.

+0

음 ... 모든 3 작품 괜찮아, 두 번째는 세 번째와 동일인지 알아 내려고. 감사! – user3900456

+0

ASP.NET 웹 API는 작업에 해당 유형의 매개 변수가있는 경우 CancellationToken도 제공합니까? –

+0

@TimothyShields : 예. –