当我尝试从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方法。