2009-12-31 6 views
1

ASP.NET MVC 앱을 만들고 있습니다. 은 내가 반환 값 내 스레드 에 대한 치료를 해달라고하는 이벤트가 발생할 때 몇 스레드를 생성하고 싶었 내가 첨부, 내가 ThreadPool.QueueUserWorkItem를 사용하고ThreadPool.QueueUserWorkItem을 올바르게 사용하고 있습니까?

public event SomeEventHandler SomeEvent; 

private void SomeEventhappened(UserProfile arg) 
     { 
      SomeEventHandler handler = SomeEvent; 
      if (handler != null) 
      { 
      // handler(currentUser); 
      foreach (SomeEventHandler wc in handler.GetInvocationList()) 
      { 
       SomeEventHandler wc2 = wc; 
       ThreadPool.QueueUserWorkItem(
        delegate { wc2(arg); } 
       ); 
      } 
      } 
     } 

를 때문에 비동기 호출을하고 싶었 행사

에 이벤트 핸들러 함수는이

this.SomeEventhappened(userProfile); //Here the event is raised 

위의 모든 코드가 같은 클래스에서 어떤 일이 일어나고, 나는 이벤트를 발생시킬 방법이다. 이벤트 처리기 함수 만 다른 클래스에 있습니다. 완료 후 스레드를 죽여야합니까? 내가 잘못한 것을 제안하면 제발.

+0

무엇 그냥 "호출"호출에 대해, AsyncController가 직접 ThreadPool이를 사용하는 대신을 활용해야하는 ASP.NET MVC 2에 있다고 생각? –

답변

1

ThreadPool을 ASP.NET 응용 프로그램에서 사용하는 올바른 방법은 not to use it입니다. ASP.NET 자체는 동일한 ThreadPool을 사용하므로 작업 항목을 대기시킬 때마다 ASP.NET이 실제로 페이지를 제공하는 데 필요한 리소스를 제거합니다.

완벽을 기하기 위해 간단하게 "Thread"이라는 표준을 만드는 것이 "기본"대안이라고 덧붙일 것입니다. 노출 된 스레드는 ThreadPool 스레드와 동일한 수준의 보호 기능을 가지고 있지 않으므로보다 방역 적으로 작업 방법을 코딩해야합니다. 그러나 이렇게하면 안전하고 ASP.NET 요청을 차단하지 않을 것입니다. .

1

이벤트를 비동기 적으로 실행하려면 각 대리인에게 BeginInvoke를 호출하면됩니다. 이를 작업 항목으로 대기시킬 필요가 없습니다.

+0

BeginInvoke를 사용하는 경우 EndInvoke를 호출해야 하는데도 그 일을하고 싶지 않습니다. – San

관련 문제