Udostępnij za pośrednictwem


Metody Socket.End nie zgłaszają wyjątku ObjectDisposedException

System.Net.Sockets.Socket.End* metody (na przykład EndSend) zgłaszają wartość SocketException zamiast ObjectDisposedException , jeśli gniazdo jest zamknięte.

Poprzednie zachowanie

Wcześniej metody, których dotyczy problem, rzuciły dla ObjectDisposedException zamkniętych gniazd.

Nowe zachowanie

Począwszy od platformy .NET 7, których dotyczy problem, metody zgłaszają wartość z ustawioną wartością SocketError.OperationAbortedSocketExceptionSocketErrorCode dla zamkniętych gniazd.

Wprowadzona wersja

.NET 7

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność binarną.

Przyczyna wprowadzenia zmiany

Interfejsy API modelu programowania asynchronicznego (APM) to te interfejsy o nazwach Begin* i End*. Począwszy od platformy .NET 6, te starsze interfejsy API są wspierane z implementacją opartą Taskna architekturze w ramach wysiłku w celu skonsolidowania i uproszczenia Socket bazy kodu. Niestety, w przypadku implementacji w wersji 6.0 nieoczekiwane zdarzenia były czasami wywoływane w systemie TaskScheduler.UnobservedTaskException. Stało się tak nawet wtedy, gdy interfejsy API były prawidłowo używane, co oznacza, że kod wywołujący zawsze wywołuje End* metody, w tym w przypadku zamknięcia gniazda.

Zmiana w celu zgłoszenia SocketException została wprowadzona w celu zapewnienia, że w takich przypadkach nie ujawniono żadnych nieobserwowanych wyjątków.

Jeśli kod przechwytuje element ObjectDisposedException z dowolnej z Socket.End* metod, zmień go, aby przechwycić SocketException i odwołać się do SocketException.SocketErrorCode zapytania o przyczynę bazową.

Uwaga

Kod APM powinien zawsze upewnić się, że End* metody są wywoływane po odpowiednich Begin* metodach, nawet jeśli gniazdo jest zamknięte.

Dotyczy interfejsów API