Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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/6/xamarin/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# 发送多线程SMTP电子邮件_C#_.net_Multithreading_Smtp - Fatal编程技术网

C# 发送多线程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

我开发了一个应用程序,主要使用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, "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);