2011-12-30 2 views
3

아주 긴 sp (SSMS에서 약 1 시간의 sp 실행 시간)를 실행하는 asp.net 페이지를 만들었습니다.긴 SP 실행 중 스레드가 중단되고 있습니까?

이 SP를 활성화하는 Admin.aspx가 있습니다. 하여 Web.config에서

I을 첨가했다 : 필자가 추가 연결 특성에도

<httpRuntime maxRequestLength="111264" requestValidationMode="2.0" executionTimeout="10000000" /> 

:

_cmd.CommandTimeout = 0; // unlimited 
함수 (SP를 활성화하는 (ASHX에) JQuery와 AJAX를 사용

그것은 잘 작동하고 있습니다)

jquery는 sp를 활성화하는 ashx 파일을 호출합니다.

그러나 나는 UI를 작업의 마지막까지 차단됩니다 싶지 않았다 그래서 ASHX 파일에 스레드 생성 :

public void ProcessRequest(HttpContext context)  
{ 
    string xmlFileNameParam = ... 
    string bakFileName = ... 

    ParameterizedThreadStart ThreadWithParam = dbFuncForThread; 

    Thread thread = new Thread(ThreadWithParam); 
    thread.IsBackground = false; 

    dynamic d = new ExpandoObject(); 
    d.XmlFileNameParam = xmlFileNameParam; 
    d.BakFileName = bakFileName; 
    thread.Start(d); 
} 

public void dbFuncForThread(dynamic d) 
{ 
    // activate the long sp 
} 

그러나 잠시 후, 내가이 오류 참조 EventLog (및 작업이 중지됨) : **

259Thread가 중단되었습니다. at System.Threading.Thread.SleepInternal (Int32 millisecondsTimeout) *

왜?

내가 스레드에게이 필요한 모든 환경 (연결 시간 초과, 실행 시간 초과)

P.S.했다 내가 스레드를 사용하고 (UI 그래도 차단되어)과 같은 일반적인 코드를 삽입하지 않은 경우 :

public void ProcessRequest(HttpContext context)   
{ 
    string xmlFileNameParam = ... 
    string bakFileName = ... 

    dynamic d = new ExpandoObject(); 
    d.XmlFileNameParam = xmlFileNameParam; 
    d.BakFileName = bakFileName; 

    dbFuncForthread(d); 
} 

public void dbFuncForThread(dynamic d ) 
{ 
    // activate the long sp... 
} 

그래서 코드가 괜찮 모든 것이 괜찮습니다. 어떻게 그리고 왜 그런가요? 어떻게 해결합니까?

+1

아마도 저장 프로 시저를 최적화 할 시간이 있습니까? – Oded

+0

@dsp는 매우 간단합니다. bak 파일을로드하고 데이터를 스크램블하고 새로운 bak을 저장합니다. 단지 해시 데이터 ... 아주 간단한 sp. –

+0

@Royi : 왜 동적 객체를 사용합니까? – abatishchev

답변

0

디자인을 다시 생각해보십시오. Windows 서비스를 사용하는 것이 좋습니다. webservice에서 thn이 sp를 실행하는 Windows 서비스로 데이터를 전달합니다. 웹 환경에서이 시나리오에 대한 명백한 문제는 IISReset 또는 appdomain recycle이 모든 스레드를 중단시킬 수 있다는 것입니다.

+0

그래서 내가 왜 스레드를 제거하면 작동합니까? 그것의 iis의 아래에서 아직도 달리고있는 것. ..? –

+0

prob는 메인 스레드가 없습니다, 당신이 화재와 잊지 경우 –

+0

'아니 메인 스레드'당신이 설명해 주시겠습니까>? –

0

스레드가 SP를 완료하는 데 오래 기다릴 필요가없는 것처럼 보입니다. SQL 호출 시간 초과가 아닙니다. 명시 적으로 새 스레드를 시작하여 SP를 호출하는 대신 비동기 적으로 호출 할 수 있습니까? Asynchronous call of a SQL Server stored procedure in C#?

+0

만약 당신의 팁, 일명 beginXXX - 그래서 asp.net 기다리지 않을까? 또한, 왜 그렇게 보인다 ** ** 내 스레드를 기다려라. ** EVEN ** 만약 내가 그에게 새로운 스레드를 말해 준다면 ...? –

+0

기다려야 할 경우 endXX에 전화 할 수 있습니다. 위의 코드로 어떤 일이 벌어지고 있는지 전혀 알 수 없습니다. 나는 일반적으로 페이지 수명주기에서 1 시간 걸리는 것을 실행하는 것은 나쁜 생각이라고 생각합니다. 한 요청에서 프로세스를 시작하고 해당 요청을 즉시 완료 할 수 있도록 응용 프로그램을 고려합니다. SP 완료에 대한 추가 작업을 수행해야하는 경우이를위한 또 다른 해결책을 제시하십시오. –

관련 문제