Los métodos Socket.End no inician ObjectDisposedException

Los métodos System.Net.Sockets.Socket.End* (por ejemplo, EndSend) inician una excepción SocketException en lugar de ObjectDisposedException si el socket se cierra.

Comportamiento anterior

Antes, los métodos afectados iniciaban una excepción ObjectDisposedException al cerrar sockets.

Comportamiento nuevo

A partir de .NET 7, los métodos afectados inician una excepción SocketException con SocketErrorCode establecido en SocketError.OperationAborted al cerrar sockets.

Versión introducida

.NET 7

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

Las API del modelo de programación asincrónica (APM) son las conocidas como Begin* y End*. A partir de .NET 6, estas API heredadas se respaldaron con una implementación basada en Task como parte de un esfuerzo por consolidar y simplificar el código base de Socket. Desafortunadamente, con la implementación de 6.0, a veces se generaban eventos inesperados en TaskScheduler.UnobservedTaskException. Esto sucedía incluso cuando las API se usaban correctamente, lo que significa que el código de llamada siempre invocaba los métodos End*, incluso cuando el socket estaba cerrado.

El cambio para iniciar una excepción SocketException se realizó para garantizar que no se filtran excepciones no controladas en esas situaciones.

Si el código detecta una excepción ObjectDisposedException en cualquiera de los métodos Socket.End*, cámbielo para detectar SocketException y consulte SocketException.SocketErrorCode para ver el motivo subyacente.

Nota

El código de APM siempre debe garantizar que se invocan métodos End* después de los métodos Begin* correspondientes, incluso si el socket está cerrado.

API afectadas