2014-04-16 4 views
1

JSON 결과를 반환하는 컨트롤러 동작 메서드가 있습니다. 이 컨트롤러 동작에서 asyc을하고 JSON 결과가 브라우저로 돌아 오기를 기다리지 않고 오래 실행중인 작업을 기다리고 있습니다. 비동기 MVC 컨트롤러 내에서 대기합니다

`public JsonResult GetAjaxResultContent(string id) 
     { 
      List<TreeViewItemModel> items = Test(); 
      //use the below long running method to do async and await operation. 
      CallLongRunningMethod(); 

      //i want this to be returned below and not wait for long running operation to complete 

      return Json(items, JsonRequestBehavior.AllowGet); 
     } 


private static async void CallLongRunningMethod() 
     { 

      string result = await LongRunningMethodAsync("World"); 

     } 

     private static Task<string> LongRunningMethodAsync(string message) 
     { 
      return Task.Run<string>(() => LongRunningMethod(message)); 
     } 

     private static string LongRunningMethod(string message) 
     { 
      for (long i = 1; i < 10000000000; i++) 
      { 

      } 
      return "Hello " + message; 
     } 

` 

그러나, 컨트롤러 액션은 장기 실행 방법을 종료 전까지 대기하고 JSON 결과를 반환 -

나는 샘플 코드 아래에 있습니다.

new System.Threading.Thread(() => CallLongRunningMethod()).Start(); 

을 그리고 새 스레드에 방법을 시작합니다

+1

... 기다리지 않으시겠습니까? 그냥 일을 해고하십시오 ... –

+0

작품! ... 감사합니다 ... – Hrishi

+1

@ 사이먼 헤드 헤드 책임을지지 않습니다. 이것은 설명 된 Nisd에 따라 문제가 발생할 가능성이 있습니다. 클라이언트 자바 스크립트가 수명이 긴 프로세스를 시작하기 위해 또 다른 요청을 보낸다면 그것은 훨씬 더 좋을 것입니다. IIS <= 7.5는 실행중인 모든 스레드에 대한 요청을 요구하고 경고없이 요청없이 작업을 종료합니다. – Aron

답변

0

당신은 다음과 같이 할 수 있습니다.

웹 서버에서 새 스레드를 시작하는 것은 좋지 않습니다. 응용 프로그램 풀이 모르는 사이에 언제든지 종료 될 수 있고 응용 프로그램을 잘못된 상태로 만들 수 있기 때문입니다.

+0

IIS는 순식간에 Windows 8/Windows 2012에서 예상대로 작동하도록 구성 할 수 있습니다. 그러나 간단하지는 않으며 권장하지 않습니다. 장시간 실행되는 프로세스를 실행하려면 Windows 서비스를 사용해야합니다. – Aron

+0

또한이 작업 자체를 해고하는 것과 다르지 않습니다. –

2

이 컨트롤러 동작에서 나는 asyc을 실행하고 JSON 결과가 브라우저로 돌아 오기를 기다리지 않고 오래 실행되는 작업을 기다리고 있습니다.

그건 어떻게 async가 작동하지 않습니다. 내 블로그에 설명하는대로 async does not change the HTTP protocol.

당신이 "배경"또는 원하는 경우 ASP.NET에서의 작업, 그것이 할 수있는 적절한, 신뢰할 수있는 방법 "화재 - 및 - 잊어"

  1. 포스트 신뢰할 수있는 큐 작업을. 예 : Azure 대기열 또는 MSMQ
  2. 대기열에서 작업을 검색하여 실행하는 독립적 인 프로세스가 있습니다. 예 : Azure webrole, Azure 웹 작업자 또는 Win32 서비스.
  3. 결과를 브라우저에 알리십시오. 예 : SignalR 또는 이메일.

ASP.NET에서 별도의 스레드 또는 작업을 시작하는 것은 매우 위험합니다. 그러나 위험에 기꺼이 살고 싶다면 library you can use to register "fire and forget" tasks with the ASP.NET runtime입니다.

관련 문제