2010-05-28 13 views
0

J'étend la classe System.Net.Mail.MailAddress pour inclure un champ ID, donc j'ai créé une nouvelle classe personnalisée MailAddress qui a hérité de la classe existante et une nouvelle classe personnalisée MailAddressCollection. J'ai ensuite surpassé le System.Net.Mail.MailMessage.To existant pour utiliser ma nouvelle collection.parallel.foreach avec la collection personnalisée

Je voudrais traiter les destinataires en parallèle, mais je ne peux pas obtenir la bonne syntaxe. C'est la syntaxe que j'utilise.

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

Je reçois les erreurs suivantes:

Le match de la meilleure méthode surchargée pour « System.Threading.Tasks.Parallel.ForEach (System.Collections.Generic.IEnumerable, System.Action) 'a quelques arguments non valides

argument 1: ne peut pas convertir de 'EmailService.MailAddressCollection' à 'System.Collections.Generic.IEnumerable'

De quelle syntaxe ai-je besoin pour utiliser des collections personnalisées?

Voici la classe 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; 
    } 
} 

Répondre

0

Je compliquais le problème. J'ai fini par utiliser Parallel.For avec un compteur au lieu de 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)); 
1

Eh bien, nous ne savons pas ce que EmailService.MailAddressCollection met effectivement en œuvre. Si elle met en œuvre que l'interface IEnumerable non générique, vous pouvez essayer ceci:

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

J'ai ajouté la classe d'adresse de messagerie. – SchwartzE

0

Vous n'êtes pas obligé de le faire. La classe SmtpClient a déjà une méthode SendAsync.

+0

Ce n'est pas le service déjà fait. Ceci est un service personnalisé pour faire des fonctionnalités supplémentaires. – SchwartzE

Questions connexes