2009-04-02 3 views
0

빠른 질문. SMTP 서버와 같은 네트워크 호출이 CPU 사용량을 차지하지 않는지 확인하고 싶습니다. 내 요청 처리 스레드 중 하나만 차단하고 이메일을 트리거 한 사용자는 내 웹 서버가 SMTP 호출을 완료하는 동안 기다려야합니다. 다른 스레드에서 전자 메일을 보내고 사용자 스레드를 계속 실행하면이 문제가 해결됩니다. 권리???최적화 - ASP.NET 응용 프로그램의 전자 메일

한 명의 동료가 smtp 서버를 사용하여 이메일을 보내는 별도의 맞춤 웹 서비스를 사용하도록 제안 했습니까?

답변

1

전자 메일을 비동기 적으로 보내려면 SmtpClient 클래스의 SendAsync 메서드를 사용하는 것이 가장 좋은 방법이라고 생각합니다. 예를 들어

:

SmtpClient client = new SmtpClient(mySMTPHost); 
client.SendAsync(myMailMessage, null); 

는 심지어 콜백 역할을하고,가 SendAsync 방법이 완료되면 호출 할 것을가 SendAsync 방법과 두 번째 매개 변수로 대표 전달할 수있다. MSDN 사이트 here의 예를 참조하십시오.

이렇게하면 주 실행 스레드를 묶지 않고 전자 메일을 비동기 적으로 보낼 수 있고 자신의 스레드를 생성하고 관리하는 복잡함을 피할 수 있습니다 (또는 별도의 "서비스"작성). .

0

당신의 이론이 소리가납니다. 전자 메일을 보내는 스레드는 응답을 기다리거나 작업이 완료 될 때까지 기다리는 데 대부분의 시간을 소비해야합니다. 이는 CPU를 많이 사용하지 않기 때문에 다른 스레드에서 CPU를 소비하지 않아야합니다.

별도의 맞춤 웹 서비스를 호출하면 불필요한 오버 헤드가 발생합니다. SMTP 서버 자체는 원격으로 호출 할 수 있습니다. 대신 사용자 정의 웹 서비스를 호출하면 다른 레이어가 추가됩니다. 하지만 동료의 생각을 잘못 이해했을 수도 있습니다.

3

이메일을 대기열에 넣고 별도의 프로세스 (서비스 또는 작업자 스레드)를 통해 전송하는 것이 좋습니다. 처음에는 구현하기위한 노력이 조금 있지만 장기적으로는 효과가 있습니다.

이메일 서버가 오프라인 상태이거나 느려질 수 있으므로 사용자를 기다려야 응용 프로그램 사용 경험이 저하 될 수 있습니다.

예를 들어 가입 확인 이메일을 보내는 경우, 일정 기간 (예 : 1 일) 동안 확인하지 않은 경우 나중에 추가 이메일을 보내야 할 수도 있습니다. 인프라가 대기중인 디자인을 지원하면이 작업이 더욱 쉬워집니다.

관련 문제