diff --git a/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs b/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs index ebf321fb439aa4..a87555145fbae8 100644 --- a/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs +++ b/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs @@ -556,9 +556,9 @@ Exception ProcessException(Exception e, ref bool canceled, bool forceWrapExcepti if (!forceWrapExceptions || // for compatibility reasons, don't wrap these exceptions during sync executions - (typeof(TIOAdapter) == typeof(SyncReadWriteAdapter) && - (e is SecurityException || e is AuthenticationException)) || - e is SmtpException) + (typeof(TIOAdapter) == typeof(SyncReadWriteAdapter) && (e is SecurityException or AuthenticationException)) || + e is SmtpException || + e is OperationCanceledException) { return e; } @@ -574,7 +574,7 @@ Exception ProcessException(Exception e, ref bool canceled, bool forceWrapExcepti // SendCompleted event should ever be invoked only for asynchronous send completions. if (invokeSendCompleted && !synchronous) { - AsyncCompletedEventArgs eventArgs = new AsyncCompletedEventArgs(exception, canceled, userToken); + AsyncCompletedEventArgs eventArgs = new(canceled ? null : exception, canceled, userToken); OnSendCompleted(eventArgs); } } diff --git a/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs index 2aeacc05b0a9e8..a7f80b45a61691 100644 --- a/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs +++ b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs @@ -314,20 +314,15 @@ public async Task SendMailAsync_CanBeCanceled_CancellationToken() server.ReceiveMultipleConnections = true; // The server will introduce some fake latency so that the operation can be canceled before the request completes - ManualResetEvent serverMre = new ManualResetEvent(false); - server.OnConnected += _ => serverMre.WaitOne(); - CancellationTokenSource cts = new CancellationTokenSource(); + + server.OnConnected += _ => cts.Cancel(); var message = new MailMessage("foo@internet.com", "bar@internet.com", "Foo", "Bar"); Task sendTask = Task.Run(() => client.SendMailAsync(message, cts.Token)); - cts.Cancel(); - await Task.Delay(500); - serverMre.Set(); - - await Assert.ThrowsAsync(async () => await sendTask).WaitAsync(TestHelper.PassingTestTimeout); + await Assert.ThrowsAnyAsync(async () => await sendTask).WaitAsync(TestHelper.PassingTestTimeout); // We should still be able to send mail on the SmtpClient instance await Task.Run(() => client.SendMailAsync(message)).WaitAsync(TestHelper.PassingTestTimeout); @@ -369,8 +364,7 @@ public async Task SendAsync_CanBeCanceled_SendAsyncCancel() client.SendAsync(message, null); AsyncCompletedEventArgs e = await tcs.Task.WaitAsync(TestHelper.PassingTestTimeout); Assert.True(e.Cancelled, "SendAsync should have been canceled"); - _output.WriteLine(e.Error?.ToString() ?? "No error"); - Assert.IsType(e.Error.InnerException); + Assert.Null(e.Error); // We should still be able to send mail on the SmtpClient instance await client.SendMailAsync(message).WaitAsync(TestHelper.PassingTestTimeout);