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.
Acción recomendada
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
- System.Net.Sockets.Socket.EndConnect(IAsyncResult)
- System.Net.Sockets.Socket.EndDisconnect(IAsyncResult)
- System.Net.Sockets.Socket.EndSend
- System.Net.Sockets.Socket.EndSendFile(IAsyncResult)
- System.Net.Sockets.Socket.EndSendTo(IAsyncResult)
- System.Net.Sockets.Socket.EndReceive
- System.Net.Sockets.Socket.EndAccept
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de