为什么SmtpClient.SendAsync只能调用一次?我正在尝试使用SmtpClient在.NET中编写通知服务(出于完全合法的非垃圾邮件目的)。最初我只是循环浏览每条消息并发送它,但这很慢,我想提高速度。因此,我改用“SendAsync”,但现在我在第二次调用时收到以下错误:异步调用已在进行中。我读到这意味着MS削弱了System.Net.Mail以防止群发邮件。这是对的吗?如果是这样,是否有更好的方法在.NET中执行此操作并且仍然能够记录每封电子邮件的结果(这对我们的客户很重要)。如果不是,为什么SendAsync只能调用一次?根据文档:调用SendAsync后,您必须等待电子邮件传输完成,然后才能尝试使用Send或SendAsync发送另一封电子邮件。因此,同时发送多封邮件,需要多个SmtpClient实例。您可以使用以下内容:ThreadPool.QueueUserWorkItem(state=>client.Send(msg));这应该允许您的消息在线程可用时排队并发送。显然,这并不是要阻止群发邮件。原因是SmtpClient类不是线程安全的。如果您想同时发送多封电子邮件,则必须生成一些工作线程(在.NETFramework中有多种方法可以做到这一点)并在每个线程中创建单独的SmtpClient实例。我认为您误解了XXXAsync类的方法。这些异步调用的目的是让程序继续运行,而不需要方法先完成处理并返回。然后您可以通过订阅对象的XXXReceived事件继续处理结果。要同时发送多封邮件,您可以考虑使用更多Thread。正如这里的其他人所注意到的,您一次只能发送一封电子邮件,但是在第一封之后发送另一封电子邮件的方法是处理SmtpClient类的.SendCompleted事件,然后转到下一封电子邮件,发送。如果您想同时发送多封电子邮件,那么就像其他人所说的那样,使用多个SmtpClient对象。每个SMTP客户端一次只能发送一个。如果您希望进行多次发送调用,请创建多个SMTP客户端。HTH,ColbyAfrica重用SmtpClient是有原因的,它限制了与SMTP服务器的连接数。要么我无法为报表构建的每个线程实例化一个新的SmtpClient类,要么SMTP服务器将拒绝太多连接错误。这是我在这里找不到答案时想到的解决方案。我最终使用AutoResetEvent来保持一切同步。这样,我可以在每个线程中继续调用我的SendAsync,但等待它处理电子邮件并使用SendComplete事件重置它,以便下一个可以继续。我设置了一个自动重置事件。AutoResetEvent_autoResetEvent=newAutoResetEvent(true);我的类是使用共享SMTP客户端设置实例化的。_smtpServer=newSmtpClient(_mailServer);_smtpServer.Port=Convert.ToInt32(_mailPort);_smtpServer.UseDefaultCredentials=false;_smtpServer.Credentials=newSystem.Net.NetworkCredential(_mailUser,_mailPassword);+=SmtpServer_SendCompleted;然后,当我调用异步发送时,我会等待事件清除,然后再发送下一个事件。_autoResetEvent.WaitOne();_smtpServer.SendAsync(邮件,邮件);邮件等待++;我使用SMTPClientSendComplete事件重置AutoResetEvent,以便发送下一封电子邮件。以上是C#学习教程:为什么SmtpClient.SendAsync只能调用一次?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——privatestaticvoidSmtpServer_SendCompleted(objectsender,System.ComponentModel.AsyncCompletedEventArgse){邮件消息)e。用户状态;if(e.Error!=null){if(e.Error.InnerException!=null){writeMessage("错误:正在发送邮件:"+thisMesage.Subject+"Msg:"+e.Error.Message+e.Error.InnerException.Message);}else{writeMessage("错误:正在发送邮件:"+thisMesage.Subject+"Msg:"+e.Error.Message);}}else{writeMessage("成功:"+thisMesage.Subject+"已发送。");}if(_messagesPerConnection>20){/*限制每个连接的消息数,发送后在下一个线程释放前重置SmtpClient*/_smtpServer=newSmtpClient(_mailServer);_smtpServer.SendCompleted+=SmtpServer_SendCompleted;_smtpServer.Port=Convert.ToInt32(_mailPort);_smtpServer.UseDefaultCredentials=false;_smtpServer.Credentials=新网络凭证(_mailUser,_mailPassword);_smtpServer.EnableSsl=true;_messagesPerConnection=0;}_autoResetEvent.Set();//这里是事件重置mailWaiting--;点击右侧联系管理员删除。如需转载请注明出处:
