간단한 개념은 여기에 있습니다. 이것은 MVC 3 및 Entity Framework 4를 사용하여 빌드되는 사이트 용입니다. 사용자가 사이트에 등록하면 전자 메일이 전자 메일 주소로 전송됩니다. SmtpClient.Send()를 사용하여이 기능을 처음으로 구현했으며 정상적으로 작동했습니다. 그런 다음 전자 메일을 비동기 적으로 보내려는 생각이 듭니다. 내가 시도한 두 가지 비동기 방식의 문제가 발생합니다. (이 답이 포스트에서 : https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asynccallback) :비동기식으로 SmtpClient를 통해 이메일을 보내는 두 가지 방법, 다른 결과
첫 번째 구현은
public bool Emailer(){
.
.
.
using (var smtpClient = new SmtpClient())
{
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("my[email protected]", "mypassword");
var sd = new SendEmailDelegate(smtpClient.Send);
var cb = new AsyncCallback(SendEmailResponse);
sd.BeginInvoke(message, cb, sd);
return true;
}
}
private delegate void SendEmailDelegate(System.Net.Mail.MailMessage m);
private static void SendEmailResponse(IAsyncResult ar)
{
try
{
SendEmailDelegate sd = (SendEmailDelegate)(ar.AsyncState);
sd.EndInvoke(ar); // "cannot access a disposed object" errors here
}
catch (Exception e)
{
_logger.WarnException("Error on EndInvoke.", e);
}
}
이 반 시간을 일했다. 나머지 절반은 콜백에서 "폐기 된 객체에 액세스 할 수 없습니다"오류가 발생합니다. (고체 명성을 가진 회원 가입일 : What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0) :
다음 구현
var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("[email protected]", "mypassword");
smtpClient.SendCompleted += (s, e) =>
{
smtpClient.Dispose();
message.Dispose();
};
smtpClient.SendAsync(message, null);
내가 오류를 얻을 그나마이 구현으로
하지만려면 SmtpClient 디버깅 모드에서 눈에 띄게 더 긴 지연 (5 ~ 초)이있다. SendAsync()가 실행되어 비동기 적으로 전송되지 않는다고 생각하게합니다.
질문 :
은 "배치 객체"오류를 일으키는 첫 번째 방법에서 무엇이 잘못되었는지1)?
2) 두 번째 구현에 이메일이 비동기 적으로 전송되지 않는 문제가 있습니까? 5 초 지연은 의미가 없습니까?
사이트에서 많은 수의 이메일 (사용자 등록, 가입 뉴스 레터 등)을 보낼 필요가 없지만 앞으로 많은 사용자를 예상 할 수는 있지만, 따라서 이메일을 비동기 적으로 보내는 결정.
감사합니다.
답장을 보내 주셔서 감사합니다. 핸들러가 발동하기 전에 오브젝트가 삭제 된 것을 볼 수 있습니다. 또한, 나는 SmtpClient를 처리해야하고 EndInvoke를 호출해야한다는 것을 알고 있습니다. # 2 접근 방식이 이것을 달성합니까? –