2010-07-15 3 views
1

페이지에 두 가지 방법이 있습니다. 하나의 AddMessageToInboxOutbox (params [])와 다른 하나의 SendNewMessageMail (params []).비동기 메서드 asp.net 사용 하시겠습니까?

사용자가 메시지를 다른 다른 사람에게 보내면 첫 번째 메시지가 DB에 추가 된 다음 수신자의 전자 메일로 전송됩니다. 때로는 SMTP가 많이로드되고 응답을 얻는 데 최대 5 초가 걸립니다. 다른 스레드 또는 뭔가를 사용하여 비동기 호출 SendNewMessageMail (params []) 동봉하고 싶습니다. 나는 결코 그것을하지 않았다.

ASP.NET에서이 작업을 어떻게 수행합니까?

답변

2

당신은 비동기 적 메소드를 호출하는 대리자를 사용할 수 있습니다

delegate void SendMailAsync(params object[] args); 

static void Main() 
{ 
    SendMailAsync del = new SendMailAsync(SendMail); 
    del.BeginInvoke(new object[] { "emailAddress" }, null, null); 
} 

static void SendMail(params object[] args) 
{ 
    // Send 
} 

이 다른 스레드를 할당 할 ThreadPool을 사용합니다. 내 예에서는 콜백도 등록하지 않습니다. 이 콜백을 지정하면 알 수없는 ThreadPool 스레드에 배치됩니다. 대리자 참조 del에서 EndInvoke을 호출하면 완료 될 때까지 차단됩니다.

EndInvoke는이 작업을 수행 할 경우, delIAsyncResult받는 참조를 유지의 BeginInvoke 방법에서 반환 된 IAsyncResult 개체를합니다. 또한 ASP.NET과 관련이 없습니다.

참고 : 멀티 스레딩은 강력한 메커니즘이자 학습의 심층 주제입니다. ASP.NET과 멀티 스레딩을 연결하는 것은 아마도 페이지 수명주기 등으로 인해 WinForms 응용 프로그램보다 복잡 할 것입니다. 멀티 스레딩 주제에 대해서도 전체적으로 읽는 것이 좋습니다.

+0

+1 멀티 스레딩에 대한 참고 사항. – driis

+0

은 ASP.NET 응용 프로그램에서이를 사용합니다. 요점은 페이지가 다시 게시 될 때 어떻게됩니까? ASync 호출이 계속 실행됩니까? – eugeneK

+0

반환을 위해 페이지 로딩이 차단되지 않고 페이지가 클라이언트로 반환되는 경우 페이지가 실행되지만 페이지 수명주기가 완료되고 재활용되므로 결과가 무의미합니다. 그러나 리턴이 요구되지 않으면, 여전히 완료 될 수 있습니다 (스레드 중단 등에 대해서는 확실하지 않습니다). 시도해보고 알려주십시오 :-) 미완성 스레드를 시뮬레이션하기 위해 오랫동안 Thread.Sleep()을 사용하여 시뮬레이션 할 수 있습니다. –

1
+0

그래서 나는 Mailing 자체를 위해 새 스레드를 열고 나머지 기능을 그대로 둘 수 있습니까? – eugeneK