2010-01-27 6 views
5

내 응용 프로그램은 iis 6 (windows 2003)에서 실행되는 asp.net 3.5입니다. 이 응용 프로그램은 매일 1000 명의 사용자 (100-500 사용자 온라인)를 제공합니다.asp.net ThreadPool - 장기 실행 작업

주간지에 이메일 뉴스 레터를 보내고 싶습니다.

매번 약 200,000 개의 이메일이 전송됩니다.

내가 사용하고 코드입니다 :

ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProcessMailerQueue), null); 

private static void AsyncProcessMailerQueue(object data) 
{ 
    for (int i=0;i<users.count ; i++) 
    { 
     MailMessage message = new MailMessage(); 
     ....... 
     SmtpClient smtpClient = new SmtpClient(); 
     smtpClient.Send(message); 
    } 
} 

나는 응용 프로그램이 많은 작업 속도가 느린 것을 볼 (내 dev에 기계에) 로컬로이 테스트.

  1. 이 코드를 작성하는 더 좋은 방법이 있습니까?
  2. ThreadPool.QueueUserWorkItem을 사용하거나 Thread t = new thread (새 ThreadStart (DoWork))을 사용하여 새 스레드를 만들어야합니까? ?
  3. 뉴스 레터를 보낼 목적으로 완전히 별도의 응용 프로그램을 만드는 것이 더 좋을까요? 이 응용 프로그램을 같은 컴퓨터에서 잘못 실행하면 도움이 될까요?

ThreadPool 대 Thread에 대해 언급 한 다른 게시물을 보았습니다.하지만 아무도 확실하지 않습니다.

답변

3

우선 순위에 따라 :

  1. 다른 응용 프로그램을 만듭니다. Windows 서비스는 좋은 선택이 될 것입니다 asp.net에서 이동 좋은 선택
  2. 사용 Thread t = new Thread(new ThreadStart(DoWork));
  3. 현재 구현
+0

감사합니다. , 만약 내가 창문 서비스를 만들뿐만 아니라 그 스레드를 사용해야합니까? asp.net을 계속 사용한다면 ThreadPool을 사용하는 것보다 새로운 스레드가 더 좋은 이유는 무엇입니까? – RuSh

+0

예, 스레드를 사용하는 것이 좋습니다. ASP.NET을 계속 사용하면 장기 실행 작업에 ThreadPool을 사용하는 것은 좋지 않습니다. 왜냐하면 이러한 스레드가 요청을 처리하는 데 사용되기 때문에 많은 작업이 차단되어 사이트가 작동을 멈출 수 있기 때문입니다. –

2

될 것이다. 이것은 명령 프롬프트에서 실행하는 간단한 명령 줄 응용 프로그램 일 수 있습니다. 왜 서비스 또는 URL로 호스팅해야합니까?

+0

URL로 호스팅 할 필요가 없지만이 asp.net 프로젝트에서 모든 함수/데이터 액세스 코드가 이미 있으므로 간단합니다. – RuSh

+0

@sharru, 프로젝트를 다른 부분으로 분해 할 수 있으며 모든 함수 액세스 및 데이터 항목을 공유 프로젝트로 분리 할 수 ​​있습니다. 이 별도의 프로세스를 실행하지 않아도 어쨌든 좋은 디자인입니다. –

+0

그 abit 늦게 :) 그 큰 프로젝트. 나는 관련 코드를 정확하고 그것을 사용할 수 있습니다, 아니면 그냥 서비스에서 asp.net DLL을 사용할 수 있습니까? – RuSh

1

예 귀하의 요청을 처리하는 데 필요한 스레드 풀에서 스레드를 차지하면서 (트래픽 양이 많은 것처럼 들리는) 스레드를 웹 애플리케이션에서 옮겨야한다고 생각합니다.

또한 스레드가 필요 이상으로 오래 사용되고 있음을 의미하는 전자 메일을 보내고 있습니다.이 ThreadPool 방식을 계속 사용하는 경우 IIS SMTP 서비스에 큐를 대기시키는 것이 좋습니다 (시스템 참조). Net.Mail.SmtpClient.DeliveryMethod)은 IIS SMTP 서비스가 모니터링하는 큐 폴더에 파일을 씁니다.

하지만 실제로 이것을 Windows 서비스로 옮겨야합니다.

+0

고마워! 좋은 조언처럼 들리네! 이것이 SmtpClient의 기본 동작이 아닌 것 같군요? – RuSh

+0

문제 없습니다. 기본 동작이 아니므로 mySmtpClientInstance.DeliveryMethod = DeliveryMethod .PickupDirectoryFromIis를 설정하고 IIS SMTP 서비스가 실행 중인지 확인해야합니다. 행운을 빕니다.. – JonoW

관련 문제