C# 发送多线程SMTP电子邮件
我开发了一个应用程序,主要使用SMTP发送电子邮件C# 发送多线程SMTP电子邮件,c#,.net,multithreading,smtp,C#,.net,Multithreading,Smtp,我开发了一个应用程序,主要使用SMTP发送电子邮件 MailMessage mail = new MailMessage(); mail.From = new MailAddress("from", "to"); mail.Subject = "subject"; mail.Body = "body"; SmtpClient client = new SmtpClient("my domain"); client.Credentials = new NetworkCredential(from
MailMessage mail = new MailMessage();
mail.From = new MailAddress("from", "to");
mail.Subject = "subject";
mail.Body = "body";
SmtpClient client = new SmtpClient("my domain");
client.Credentials = new NetworkCredential(from, "MyPass");
client.Send(mail);
这很好,但现在我想在不等待的情况下同时发送多条消息,因此我将所有消息都放在一个列表中:
List<MailMessage> emails = new List<MailMessage>();
emails.Add(new MailMessage (...));
emails.Add(new MailMessage (...));
emails.Add(new MailMessage (...));
...
得到了这个错误:
没有SendMailAsync,最后一行代码也有错误: “await”运算符只能在异步方法中使用。考虑 使用“async”修饰符标记此方法并更改其返回值 键入“任务”
发生此错误是因为您正在所有线程捕获的同一SmtpClient实例上进行多个SMTP调用 为了简洁起见,您可以在的源代码中看到它:
try
{
// If there is already an ongoing SMTP request
if (InCall)
{
throw new InvalidOperationException(SR.GetString(SR.net_inasync));
}
}
通常,不需要使用任何线程来执行I/O绑定操作,因为它们本质上是异步的
相反,您可以使用async await来利用异步API:
// Generate and execute all mails concurrently
var emailTasks = emails.Select(msg =>
{
var client = new SmtpClient();
return client.SendMailAsync(msg));
});
// Asynchronously wait for all of them to complete.
await Task.WhenAll(emailTasks);
我需要把代码放在哪里?SendAsync需要更多参数object userToken-我应该在这里放什么?SmtpClient.SendMailAsync,而不是SendAsync。没有SendMailAsync,最后一行代码也有错误:“await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”@ MGGY,请用完整的方法执行编辑您的问题,以便我能正确回答。
// Generate and execute all mails concurrently
var emailTasks = emails.Select(msg =>
{
var client = new SmtpClient();
return client.SendMailAsync(msg));
});
// Asynchronously wait for all of them to complete.
await Task.WhenAll(emailTasks);