Na podstawie liczby pytań, postów na forum itd. Okazuje się, że implementacja TcpClient/NetworkStream w BCL nie zapewnia przyzwoitej obsługi anulowania operacji we/wy. Wraz z dodatkiem metod Async w .NET 4.5, ten brak anulowania (lub przyzwoity limit czasu) sprawia, że rzeczy są jeszcze bardziej frustrujące, ponieważ staje się jeszcze bardziej skomplikowane (prawie niemożliwe), aby anulować zadanie, które odmawia monitorowania jego Tonu Anulowania podczas wykonywania IO ..NET Implementacja TcpClient/NetworkStream, która obsługuje operacje asynchroniczne i respektuje limity czasu.
Widziałem wiele implementacji, które uruchamiały dodatkowe wątki w celu monitorowania działania sieci i zamykania ukrytego strumienia, jeśli coś wydaje się nie działać. Czuje się bardzo brudno w świecie, w którym staramy się oszczędzać te zasoby za pomocą operacji asynchronicznych.
Czy ktoś może wskazać mi kierunek wskazówek, jak radzić sobie z efektywnym anulowaniem/ograniczaniem czasu operacji IO sieci lub w kierunku solidnej implementacji strony trzeciej, która faktycznie działa?
myślałem CancelIo/CancelIoEx zostały funkcje OS poziomie, aniżeli te, powołując się na kierowców, aby je realizować/wsparcia? – Andrew
Są to interfejsy Win32 API, które wywołują kerneny wywołujące kierowcę. Jeśli anulujesz duży odczyt, sterownik musi współpracować, nakazując zatrzymanie dysku. CancelIO ma efekty fizyczne. – usr
Dzięki za popchnięcie mnie w tym kierunku. Pomyślałem, że CancelIo/CancelIoEx były na poziomie systemu operacyjnego i nie wymagały obsługi na poziomie sterowników. Zrobiłem trochę więcej badań na ten temat, natknąłem się na ten post (nie mam pojęcia, jak wcześniej tęskniłem), który omawia wyzwania związane z anulowaniem asynchronicznej IO. Wygląda na to, że IO oparte na plikach jest zgodne, ale sieć nie działa. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew