2010-12-10 5 views
3

이것은 두포에서 진행되는 작업에 대한 이해가 부족하거나 일반적으로 스레딩에 대한 이해가 부족하기 때문일 수 있습니다. 사용자가 로그인하면 웹 서비스를 호출하는 일부 작업을 실행하여 시스템의 데이터를 업데이트해야합니다. 서비스는 상당한 시간이 걸릴 수 있기 때문에 전체 프로세스를 처리합니다. 그러나, 비록 내가 전체 응용 프로그램과 별도의 스레드에서 일련의 작업을 실행한다고 생각하더라도 응용 프로그램은 호출되기 전의 함수가 완료 될 때까지 대기합니다.ThreadPool.QueueUserWorkItem이 종료 될 때까지 응용 프로그램이 멈추는 원인이 될 수 있습니다.

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
Manager manager = (Manager)Session["Manager"]; 

ThreadPool.QueueUserWorkItem(new SafeWaitCallback().Call(identity, delegate(object noCallBack) 
{ 
    manager.RunAccountUpdater(identity); 
})); 

"RunAccountUpdater"함수가 끝나고 콜백이 발생할 때까지 응용 프로그램이 중단됩니다. 내가 뭘 잘못하고/이해하지 못하고 있니?

+3

관련 스레드 동기화 코드가 있습니까? 어울리다? 자물쇠? 뮤텍스? Control.Invoke와 비슷한 것은 무엇입니까? 차단할 수있는 다른 것은 없습니까? –

+0

명백한 것은 없습니다. – Chris

+4

'새 SafeWaitCallback(). 통화가 동 기적으로 실행됩니다. 그 결과 (WaitCallback이라고 가정 함) 만 ThreadPool에서 스케줄됩니다. 응용 프로그램을 차단하는 새로운 SafeWaitCallback(). Call이 아닌'manager.RunAccountUpdater'입니까? 'SafeWaitCallback' 클래스의 전체 코드를 추가 할 수 있습니까? ([this] (http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx)와 비교하여 수정 한 것 같습니다. – dtb

답변

0

실제로 성명을 통해 성명서를 읽으십시오 - 그것은 분명합니다.

ThreadPool.QueueUserWorkItem (새 SafeWaitCallback() 호출 (정체성, 위임 (noCallBack 객체) { manager.RunAccountUpdater (정체성) }.));

이것은 내부에서 발생합니다.

  • 대리인을 선언했습니다.
  • 그런 다음 SafeWaitCallback()을 사용하여 EXECUTE 작업을 수행하십시오.
  • 그런 다음 호출 결과를 .... 스레드 풀에 대기열에 넣습니다.

Voila - 여기에 문제가 있습니다. 실행 결과가 아니라 위임자에게 호출을 대기시켜야합니다.

관련 문제