繁体   English   中英

具有自定义集合的parallel.foreach

[英]parallel.foreach with custom collection

我正在扩展System.Net.Mail.MailAddress类以包括ID字段,因此我创建了一个新的自定义MailAddress类,该类继承自现有类和新的自定义MailAddressCollection类。 然后,我覆盖了现有的System.Net.Mail.MailMessage.To以使用我的新集合。

我想并行处理接收者,但是语法不正确。 这是我使用的语法。

Parallel.ForEach(EmailMessage.To, (MailAddress address) =>
{
    emailService.InsertRecipient(emailId, address.DisplayName, address.Address, " ");
});

我收到以下错误:

最佳重载方法匹配'System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable,System.Action)'有一些无效的参数

参数1:无法从“ EmailService.MailAddressCollection”转换为“ System.Collections.Generic.IEnumerable”

使用自定义集合需要什么语法?

这是EmailService.MailAddress类:

public class MailAddress : System.Net.Mail.MailAddress
{
    /// <summary>
    /// Contains an identifier of the address for use in sending unique email links.
    /// </summary>
    public string ID = "";

    public MailAddress(string Address) : base(Address) 
    { 

    }

    public MailAddress(string Address, string Name): base(Address, Name)
    {

    }

    public MailAddress(string Address, string Name, string Id) : base(Address, Name)
    {
        ID = Id;
    } 
}

好吧,我们不知道EmailService.MailAddressCollection实际实现了什么。 如果它仅实现非通用IEnumerable接口,则可以尝试以下操作:

Parallel.ForEach(EmailMessage.To.Cast<MailAddress>(), address =>
{
    emailService.InsertRecipient(emailId, address.DisplayName,
                                 address.Address, " ");
});

您不需要这样做。 SmtpClient类已经具有一个SendAsync方法。

我使问题复杂化了。 我最终使用带有计数器而不是ForEach的Parallel.For。

System.Threading.Tasks.Parallel.For(0, EmailMessage.To.Count, 
i => emailService.InsertRecipient(emailId, EmailMessage.To[i].DisplayName, 
EmailMessage.To[i].Address, EmailMessage.To[i].Id));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM