Большая задержка в методах ImapClient, SmtpClient и Pop3Client Connect при использовании безопасного соединения - PullRequest
0 голосов
/ 15 января 2019

При попытке подключиться к SMTP или IMAP-клиенту из MailKit я замечаю задержку до 13 секунд. Кажется, задержка происходит при вызове метода AuthenticateAsClient внутри библиотеки MailKit. Я нашел объяснение проблемы здесь https://blogs.msdn.microsoft.com/alejacma/2011/09/27/big-delay-when-calling-sslstream-authenticateasclient/

Это не проблема в MailKit, но я хочу знать, как лучше обойти эту проблему, используя MailKit. Похоже, что cancellationToken, переданный методу MailKit Connect, не отменяет этот вызов метода. Это проблема, когда вы хотите завершить процесс во время подключения SmtpClient, потому что вы хотите дождаться завершения выделенного потока, выполняющего этот код.

Это обходной путь, который у меня есть, но он не очень элегантный

public override void Connect(string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default(CancellationToken))
{
    var connectionTask = smtpClient.ConnectAsync(host, port, options, cancellationToken);

    Task.WhenAny(connectionTask, cancellationToken.WhenCanceled()).GetAwaiter().GetResult();

    cancellationToken.ThrowIfCancellationRequested();
}

public static class Extensions
{
    public static Task WhenCanceled(this CancellationToken cancellationToken)
    {
        var tcs = new TaskCompletionSource<bool>();
        cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).SetResult(true), tcs);
        return tcs.Task;
    }
}

Это выше будет работать в большинстве случаев, но если отменить токен, соединение останется в состоянии соединения (потому что AuthenticateAsClient не может быть отменен), и пользователь может попытаться выполнить другую команду, пока smtpClient все еще пытается подключиться.

Я ищу лучший подход для отмены метода Connect в контексте MailKit.

...