2013-06-11 2 views
1

ASP.NET WebMethod에 대한 JQuery AJAX 호출이 있습니다.JQuery AJAX가 다중 스레드 된 WebMethod를 호출합니다.

저는 async: true을 이해합니다.이 기능을 사용하면 함수가 반환 될 때까지 웹 페이지가 잠기지 않으므로 'true'으로 설정할 수 있습니다.

내가 직면하고있는 문제는 GetVersion() 내부의 GetVersionFromDataBase() 내부 메서드는 완료 될 때까지 오랜 시간이 걸리고, 전체 백엔드는 잠긴다 (단일 스레드).

사용자 경험은 다른 페이지에서도 웹 사이트를 탐색하는 다른 사용자의 경우 '무거운'방법이 반환 될 때까지 화면이 잠겨 있다는 것입니다.

GetVersionFromDataBase()을 다른 스레드/작업에 포함시킬 수 있습니까?

$.ajax({ 
    type: "POST", 
    url: "Default.aspx/GetVersion", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    async: true, 
    success: function (result) { 
     alert('the version is:' + result.d); 
    } 
}); 



public partial class Default : System.Web.UI.Page 
{ 
    [WebMethod] 
    public string GetVersion() 
    { 
     string version = GetVersionFromDatabase(); // this is a heavy method freezes the program till it finishes 
     return version; 
    } 
} 
+0

당신은이 "전체 백엔드 (단일 스레드) 잠겨"당신이 IIS에서 프로덕션 환경에서 발생하는 뜻 말할 때? 또는 개발 웹 서버에서 이러한 현상이 발생하고 있습니까? 각 요청은 IIS에 의해 비동기 적으로 처리되어야합니다. – Rob

+0

Rob, 내 개발 웹 서버에서 일어나고 있습니다. 메서드가 호출되는 동안 새 탭이 열리고 전체 웹 사이트가 멈 춥니 다. 프로덕션 IIS에서 다르게 작동한다고 생각하십니까? – user829174

+0

제 경험상, 개발 서버에서만 발생합니다. 이 게시물을 참조하십시오 : http://stackoverflow.com/questions/9036150/asp-net-development-server-concurrent-processing-doesnt-work – Rob

답변

0

편집 : @ 롭은 장기 실행 프로세스가 하나의 사용자 (당신이 그것을하고있는 경우에도 방법)에 의해 쫓겨 정말 모든 CPU 사이클을 먹고하지 않으면 정말 다른 사용자에게 영향을 미치지 않습니다 권리 그리고 그 경우에는 내 접근법은 그 문제에 도움이되지 않을 것입니다.

이 문제 (ASP.NET 장기 실행 프로세스)에 접근하는 데는 몇 가지 방법이 있습니다. 나는 항상 클라이언트 측 폴링 접근법을 가진 서버 측 배경 스레드를 사용 해왔다. 이것이 의미하는 바는 응용 프로그램이 다음과 같이 작동한다는 것입니다.

1) 클라이언트는 장기 실행 프로세스를 시작하려고 함을 나타냅니다.

2) 서버는 백그라운드 스레드에서 프로세스를 시작하고 고유 한 식별자를 클라이언트에 반환합니다.

3) 클라이언트는 일정 시간 기다렸다가 서버에 "아직 도착 했습니까?"라고 묻습니다. (장거리 차량의 뒷좌석에있는 아이들을 생각해보십시오.)이 질문에 2 단계에서 나온 식별자를 전달하여 서버가 완료를 확인할 작업을 알고 있는지 확인하십시오.

4) 서버가 "아직 없습니다."(3 단계로 돌아 가기) 또는 "예 우리는 있습니다 .."(5 단계로 이동).

5) 장기 실행 프로세스가 완료되면 클라이언트는 서버에서 일부 결과를 요청하여 표시하거나 사용자에게 작업이 완료되었음을 알립니다.

지금 코드 작성 방법은 무엇입니까? 이것은 내가 꽤 몇 년 동안 사용했던 자원이며, 내가 수업에 몇 가지 사소한 변경 한 저를 잘 역임했다하지만 전반적인 접근 방식은 고체 :

여기 http://www.devx.com/asp/Article/29617

다른입니다 : 당신이 당신의 응용 프로그램이 적 부하 분산 환경에서 제공 될 경우이이 코드를 때

http://www.allannienhuis.com/archives/2010/11/27/long-running-asp-net-processes-a-simple-example/

한 가지 고려해야 할. 그렇다면 "고정 세션"을 구성하거나 고유 한 작업 식별자 키와 관련 작업이 각 웹 서버에서 액세스 할 수 있도록해야 할 수 있습니다. 즐겨!

관련 문제