parallel.foreach与自定义集合

时间:2010-05-28 17:24:55

标签: c# .net-4.0 parallel-processing

我正在扩展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;
    } 
}

3 个答案:

答案 0 :(得分:1)

好吧,我们不知道EmailService.MailAddressCollection实际实现了什么。如果它只实现了非通用的IEnumerable接口,你可以试试这个:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我让问题复杂化了。我最后使用Parallel.For而不是ForEach。

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));