параллель - PullRequest
       38

параллель

0 голосов
/ 28 мая 2010

Я расширяю класс System.Net.Mail.MailAddress для включения поля идентификатора, поэтому я создал новый пользовательский класс 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 ]

1 голос
/ 28 мая 2010

Ну, мы не знаем, что на самом деле реализует EmailService.MailAddressCollection. Если он реализует только неуниверсальный интерфейс IEnumerable, вы можете попробовать это:

Parallel.ForEach(EmailMessage.To.Cast<MailAddress>(), address =>
{
    emailService.InsertRecipient(emailId, address.DisplayName,
                                 address.Address, " ");
});
0 голосов
/ 09 июня 2010

Я усложнил проблему. В итоге я использовал 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));
0 голосов
/ 28 мая 2010

Вам не нужно это делать. Класс SmtpClient уже имеет метод SendAsync .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...