2013-07-28 5 views
0

비동기 컨트롤러에서 비동기 작업을하려고합니다. 내가해야 할 일은보기에서 버튼을 누르면 작업 완료를 알리는 경고 메시지가 나타납니다. 작업이 끝나면 뭔가 할 수 있습니다 (예를 들어 json을 반환하거나 다른보기로 리디렉션). 여기 내 코드입니다 :MVC의 비동기 작업이 작동하지 않습니다.

서버 측 :

public void DoWork() 
    { 
     var a = MakeADelay(); 
    } 

    public async Task<ActionResult> MakeADelay() 
    { 
     await Task.Delay(5000); 
     return RedirectToAction("UploadComplete"); 
    } 

    public ActionResult UploadComplete() 
    { 
     return View(); 
    } 

이 내 클라이언트 측 코드 :이 코드는 모두가 예상대로 실행 보이지만 실행하면

 $("#btnAsync").click(function() { 
     $.ajax({ 
      url: '/Upload/DoWork', 
      type: "post", 
      success: function() { 
       alert("Work in Progress!!"); 
      } 
     }); 
    }); 

때 서버 측 코드 문 return RedirectToAction("UploadComplete");에 도달하면 아무것도하지 않습니다! 나는 그것이 다른 스레드 또는 뭔가에서 실행되는 것 같아요.

무엇이 문제입니까?

두 번째 질문은 동기화 작업이 실제로 의미하는 것입니다. 나는 진술이 완전 해지기를 기다리는 나의 행동을 결코 원하지 않는다. 항상 작업을 실행 대기열로 보내고 클라이언트로 돌아가는 작업을 원하고 작업이 완료되면 클라이언트에게 어떤 방식 으로든 알릴 수 있습니다. 어쨌든 클라이언트에게 어떻게 알릴 수 있습니까? SignalR 또는 무엇인가?

+0

UploadComplete() 작업에 대한보기가 있습니까? redirecttoactino가 아무것도하지 않는다는 것을 어떻게 말하고 있습니까? – ckv

+0

물론 리디렉션 설명문에 해당하는보기가 있습니다. 하지만 실행되면 리디렉션이 발생하지 않습니다! 너는 이걸 시험해보고 너에게 달렸는지 알려주지. 사실 내 UploadComplete() 메소드는 결코 실행되지 않습니다. 중단 점은 절대로 안타. – Pouyan

+0

죄송합니다. 나는 asyc 기다리는 부분에 익숙하지 않습니다. 그래서 나는 너에게 도움이되지 않을지도 모른다. – ckv

답변

1

무엇이 문제입니까?

은 여기 :이 무엇

public void DoWork() 
{ 
    var a = MakeADelay(); 
} 

MakeADelay을 시작하고 즉시 아마도 응답을 생성 완료하고 전송 호출자에게 반환합니다.

지연이 완료되면 MakeADelayRedirectToAction을 호출하여 계속 실행을 시도합니다. 그러나 해당 요청에 대한 응답이 이미 전송되었으므로 예외가 발생할 가능성이 가장 높습니다 (결코 await 작업 이후로 무시됩니다) a. 아니면 아무 것도하지 않겠지 만, 정확히 무엇을 은하지 않습니다. do는 이미 돌아가서 이미 보낸 응답을 다시 작성합니다.

두 번째 질문은 동기화 작업이 실제로 의미하는 것입니다.

나는 유용하다고 생각되는 introduction on the subject입니다. 나는 또한 나의 블로그에 async does not change the HTTP protocol을 기술한다 - 당신은 여전히 ​​모든 요청에 ​​대해 하나의 응답을 얻는다. 당신이하려는 것은 하나의 요청에 대해 두 개의 응답을 보내면 작동하지 않을 것입니다.

항상 작업을 실행 대기열로 보내고 클라이언트로 돌아가고 작업이 완료되면 클라이언트에게 어떤 방식 으로든 알릴 수 있습니다. 어쨌든 클라이언트에게 어떻게 알릴 수 있습니까? SignalR 또는 무엇인가?

그러면 대기열이 필요합니다. 나는 지속성 보장과 함께 out-of-process 무언가를 추천한다. 예 : Azure 대기열, MSMQ, WebSphere MQ 등

예, 알림을 위해 SignalR을 사용할 수 있습니다. 나는 그것을 권하고 싶다.

+0

스티븐, 고맙습니다. 비동기적인 것들이 최고입니다. 그것은 정확히 내가 기다리고 있던 대답이다. – Pouyan

관련 문제