C # отправка нескольких писем асинхронно с токеном отмены - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь отправить несколько сообщений с помощью SendMailAsync, и я пытаюсь передать токен отмены, чтобы прервать процесс отправки, когда запрос отмены.

static void Send(SmtpClientFactory factory, IEnumerable<MailMessage> messages)
{
    Task.WaitAll(SendAsync(factory, messages, CancellationToken.None));
}

static async Task SendAsync(SmtpClientFactory factory, IEnumerable<MailMessage> messages, CancellationToken token)
{
    await Task.Run(async () =>
    {
        using (SmtpClient smtpClient = factory())
        {
            foreach (MailMessage message in messages)
            {
                await smtpClient.SendMailAsync(message).ConfigureAwait(false);
            }
        }
    }, token);
}

Когда я использую не асинхронную отправкупопал в тупик.Как я могу отправить свое сообщение синхронно и использовать токен отмены для отмены, когда время истекло?

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете объединить CancellationToken.Register и SmtpClient.SendAsyncCancel, чтобы сделать то, что вам нужно:

static async Task SendAsync(SmtpClientFactory factory, IEnumerable<MailMessage> messages, CancellationToken token)
{
    await Task.Run(async () =>
    {
        using (SmtpClient smtpClient = factory())
        {
            foreach (MailMessage message in messages)
            {
                token.ThrowIfCancellationRequested();

                using (token.Register(() => smtpClient.SendAsyncCancel()))
                {
                    await smtpClient.SendMailAsync(message).ConfigureAwait(false);
                }
            }
        }
    }, token);
}

Имейте в виду, что SmtpClient официально объявлен устаревшим :

SmtpClient и его сеть типов плохо спроектированы, мы настоятельно рекомендуем использовать https://github.com/jstedfast/MailKit и https://github.com/jstedfast/MimeKit вместо

Мало того, что MailKit является поточно-безопасным, но этогораздо более гибкий с точки зрения построения сообщений и поддерживает CancellationToken для загрузки!

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