Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我试着从我的程序一次发送300封邮件到相同的电子邮件id。我收到以下SMTP异常_C#_Asp.net_Email_Smtp_Smtpclient - Fatal编程技术网

C# 我试着从我的程序一次发送300封邮件到相同的电子邮件id。我收到以下SMTP异常

C# 我试着从我的程序一次发送300封邮件到相同的电子邮件id。我收到以下SMTP异常,c#,asp.net,email,smtp,smtpclient,C#,Asp.net,Email,Smtp,Smtpclient,错误:System.Net.Mail.SmtpException:发送邮件失败。-->System.ArgumentException:没有从此类上相应的异步方法返回IAsyncResult对象。参数名称:System.Net.Mime.MimeBasePart.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.Message.EndSend处的asyncResult(IAsyncResult asyncResult)Sy

错误:System.Net.Mail.SmtpException:发送邮件失败。-->System.ArgumentException:没有从此类上相应的异步方法返回IAsyncResult对象。参数名称:System.Net.Mime.MimeBasePart.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.Message.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.SmtpClient.SendMessageCallback(IAsyncResult result)-内部异常堆栈跟踪结束---


如何避免此错误?

使用
ManualResetEvent
对象。我猜SmtpClient正在被处理,这就是为什么它会丢失对
MailClient\u SendCompleted

ManualResetEvent resetEvent;
private void DispatchMail(MailMessage message, MessageTrackerObject trackInfo)
{
    // other code here
    resetEvent = new ManualResetEvent(false);
    mailClient.EnableSsl = GetStaticSetting(Constants.APPCONFIG_KEY_MAIL_SSL).ToLower() == "true";
    mailClient.SendCompleted += new SendCompletedEventHandler(MailClient_SendCompleted);
    mailClient.SendAsync(message, trackInfo);
    resetEvent.WaitOne(TimeSpan.FromSeconds(5)); // waits for 5 seconds
    //mailClient.Send(message);
}

private void MailClient_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
    resetEvent.Set(); // removes the wait after successfully sending
    string error = "";
    MessageTrackerObject data = (MessageTrackerObject)e.UserState;
    // other code here
}

这里最可能的问题是
MailMessage
的同一个实例被传递到
DispatchMail
MailMessage
在设计上不是线程安全的,每个
SmtpClient.SendAsync
都在内部调用
Message.BeginSend

因此,当多个线程试图发送相同的
MailMessage
时,调用
Message.EndSend
时存在竞争条件。如果调用
EndSend
的线程与调用
BeginSend
的线程相同,那么我们很幸运。如果不是,则引发上述异常

IAsyncResult对象未从相应的 此类上的异步方法

这里的解决方案是为每次调用
SendAsync
复制
MailMessage
,或者使用
SendAsync
重载,该重载接受5个参数:

void SendAsync(string from, string recipients, string subject, string body, object token)
编辑: 这个异常很容易复制,以证明MailMessage不是线程安全的。您可能会遇到多个异常,
IAsyncResult
上面的一个异常,或者在填充标题时已添加了

using System;
using System.Net.Mail;
using System.Threading.Tasks;
class App
{
  static void Main()
  {
     var mail = new MailMessage("aaa@bbb.ccc", "ddd@eee.fff", "Test Subj", "Test Body");
     var client1 = new SmtpClient("localhost");
     var client2 = new SmtpClient("localhost");
     var task1 = client1.SendMailAsync(mail);
     var task2 = client2.SendMailAsync(mail);
     Task.WhenAll(task1, task2).Wait();
  }
}

显示一些代码怎么样?这里绝对没有什么可出去的。如果你只有这些,用谷歌搜索错误消息。你能发布邮件客户端对象代码,特别是SendAsync吗?是的,我已经添加了代码。@user3332414我已经添加了答案
using System;
using System.Net.Mail;
using System.Threading.Tasks;
class App
{
  static void Main()
  {
     var mail = new MailMessage("aaa@bbb.ccc", "ddd@eee.fff", "Test Subj", "Test Body");
     var client1 = new SmtpClient("localhost");
     var client2 = new SmtpClient("localhost");
     var task1 = client1.SendMailAsync(mail);
     var task2 = client2.SendMailAsync(mail);
     Task.WhenAll(task1, task2).Wait();
  }
}