C# MailKit ConnectAsync。当另一个读取操作挂起时,无法调用ReadAsync方法

C# MailKit ConnectAsync。当另一个读取操作挂起时,无法调用ReadAsync方法,c#,mailkit,C#,Mailkit,我使用MailKit通过计时器发送电子邮件。 我将smtpClient保存在ConcurrentDictionary中。 有时,我在尝试异步连接时出错:当另一个读取操作挂起时,无法调用ReadAsync方法 public async Task SendMessageAsync(string consumerKey, SmtpServer server, EmailMessage message) { SmtpClient client = new SmtpClien

我使用MailKit通过计时器发送电子邮件。 我将smtpClient保存在ConcurrentDictionary中。 有时,我在尝试异步连接时出错:当另一个读取操作挂起时,无法调用ReadAsync方法

public async Task SendMessageAsync(string consumerKey, SmtpServer server, EmailMessage message)
{            
   SmtpClient client = new SmtpClient();
   if (!_clients.TryAdd(consumerKey, client))
   {
       client = _clients[consumerKey];
   }

   if (!client.IsConnected) await ConnectSmtpClient(server, client);
...
}
private async Task ConnectSmtpClient(SmtpServer server, SmtpClient client)
{
   try
   {
       await client.ConnectAsync(server.Address, server.Port, server.UseSSL);
       await client.AuthenticateAsync(new SaslMechanismLogin(server.Credentials));
   }
    catch (Exception e)
   {
        Console.WriteLine(e);
        throw;
   }
 }
在System.Net.Security.SslStream.[ReadAsyncInternal]d_u214`1.MoveNext()中 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()中 在MailKit.Net.Smtp.SmtpStream上。[ReadAheadAsync]d_u39.MoveNext() 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在MailKit.Net.Smtp.SmtpStream上。[ReadResponseAsync]d_u46.MoveNext() 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()中 在MailKit.Net.Smtp.SmtpClient.[SendCommandAsync]d_u63.MoveNext()中 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()中 位于MailKit.Net.Smtp.SmtpClient。[SendEhloAsync]d_u65.MoveNext() 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在MailKit.Net.Smtp.SmtpClient.[EhloAsync]d_u66.MoveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在MailKit.Net.Smtp.SmtpClient.[ConnectAsync]d__74.MoveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
您可能会遇到多个线程正在访问同一个SmtpClient对象的情况

由于MailKit的SmtpClient不是线程安全的,因此如果您尝试从多个线程发送邮件(或连接/验证),则会出现问题

at System.Net.Security.SslStream.[ReadAsyncInternal]d__214`1.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at MailKit.Net.Smtp.SmtpStream.[ReadAheadAsync]d__39.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at MailKit.Net.Smtp.SmtpStream.[ReadResponseAsync]d__46.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at MailKit.Net.Smtp.SmtpClient.[SendCommandAsync]d__63.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at MailKit.Net.Smtp.SmtpClient.[SendEhloAsync]d__65.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at MailKit.Net.Smtp.SmtpClient.[EhloAsync]d__66.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at MailKit.Net.Smtp.SmtpClient.[ConnectAsync]d__74.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)