使用安全连接时,ImapClient,SmtpClient和Pop3Client Connect方法的较大延迟

时间:2019-01-15 11:14:56

标签: mailkit

当我尝试从MailKit连接SMTP或IMAP客户端时,我注意到最多延迟13秒。似乎延迟发生在对MailKit库中的AuthenticateAsClient方法的调用上。我在这里https://blogs.msdn.microsoft.com/alejacma/2011/09/27/big-delay-when-calling-sslstream-authenticateasclient/

找到了问题的解释

这不是MailKit中的问题,但是我想知道使用MailKit解决此问题的最佳方法。似乎传递给MailKit Connect方法的canceleToken并未取消此方法调用。当您要在连接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仍尝试连接时尝试执行另一条命令。

我正在寻找一种更好的方法来取消MailKit上下文中的Connect方法。

0 个答案:

没有答案