当用户在我的网站上注册时,我不明白为什么我需要让他"等待"smtp通过才能获得激活电子邮件.
我决定以异步方式启动此代码,这是一次冒险.
让我们想象一下我有一个方法,例如:
private void SendTheMail() { // Stuff }
Run Code Online (Sandbox Code Playgroud)
我的第一个虽然是线程.我这样做了:
Emailer mailer = new Emailer();
Thread emailThread = new Thread(() => mailer.SendTheMail());
emailThread.Start();
Run Code Online (Sandbox Code Playgroud)
这工作......直到我决定测试它的错误处理能力.我故意破坏了我的web.config中的SMTP服务器地址并尝试了它.可怕的结果是IIS基本上BARFED与w3wp.exe上的未处理的异常错误(这是一个Windows错误!多么极端......)ELMAH(我的错误记录器)没有捕获它并且IIS重新启动所以网站上的任何人都有他们的会话被删除了.完全不可接受的结果!
我的下一个想法是,对异步代表进行一些研究.这看起来效果更好,因为在异步委托中处理异常(与上面的线程示例不同).但是,我担心如果我做错了或者我可能导致内存泄漏.
这是我正在做的事情:
Emailer mailer = new Emailer();
AsyncMethodCaller caller = new AsyncMethodCaller(mailer.SendMailInSeperateThread);
caller.BeginInvoke(message, email.EmailId, null, null);
// Never EndInvoke...
Run Code Online (Sandbox Code Playgroud)
我这样做了吗?
我有这个PreloadClient实现的对象IDisposable,我想处理它,但在异步方法完成它们的调用之后......这没有发生
private void Preload(SlideHandler slide)
{
using(PreloadClient client = new PreloadClient())
{
client.PreloadCompleted += client_PreloadCompleted;
client.Preload(slide);
}
// Here client is disposed immediately
}
private void client_PreloadCompleted(object sender, SlidePreloadCompletedEventArgs e)
{
// this is method is called after a while,
// but errors are thrown when trying to access object state (fields, properties)
}
Run Code Online (Sandbox Code Playgroud)
那么,任何想法或工作?
这里简单的概念.这适用于使用MVC 3和Entity Framework 4构建的站点.用户在站点上注册后,会向其电子邮件地址发送一封电子邮件.我首先使用SmtpClient.Send()实现它,它工作正常.然后我明白了尝试异步发送电子邮件.我遇到了我尝试过的两种异步方法的问题.
第一个实现(来自这个未回答的帖子:https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asynccallback):
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("myaddress@gmail.com", "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" …Run Code Online (Sandbox Code Playgroud) 我正在创建Windows服务,每5分钟发送一批电子邮件.
我想每5分钟发送一批10-100封电子邮件.这是极端的边缘情况.批次每5分钟发送一次,通常包含最多10封电子邮件.
我正在使用System.Net.Mail命名空间中的SmtpClient.
什么是SmtpClient对象的适当生命周期?每次发送批次时我应该创建一个吗?或者我应该在服务启动时创建一个并且永远不会丢弃它?
应用程序要求使用SendAsync而不仅仅是Send.所以我做了一个类CEmailServer并设置了一切.到目前为止发送工作正常,但更改它以使用SendAsync时,它没有.我创建了一个在发送邮件时调用的方法,并且userToken就位,但它仍然失败.我找不到我的错误.这是我的代码:
static bool mailSent = false;
//Method for Sending with attachment.
public void SendEmail(string Address, string Recipient, string Subject, string Body, string Dir)
{
var fromAddress = new MailAddress("someadress.kimberley@gmail.com", "My Company");
var toAddress = new MailAddress(Address, Recipient);
const string fromPassword = "password";
string subject = Subject;
string body = Body;
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message …Run Code Online (Sandbox Code Playgroud) c# ×5
asynchronous ×3
.net ×2
email ×2
asp.net ×1
dispose ×1
idisposable ×1
sendasync ×1
service ×1
smtp ×1
smtpclient ×1