2012-06-07 28 views
5

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?

Odpowiedz

4

Anulowanie IO nie jest trywialne. Począwszy od wersji Vista mamy funkcję CancelIO, ale jest to całkiem nowa rzecz i sterowniki muszą ją wspierać.

Praktycznie rzecz biorąc, najlepiej jest zamknąć gniazdo, aby anulować wszystko. Alternatywnie można zaimplementować funkcję otoki wokół zadania, która zapewnia natychmiastowe zakończenie, gdy zostanie ustawiony Token Anulowania. Operacja IO nadal będzie kontynuowana, ale jej wynik zostanie odrzucony.

Oto dogłębną dyskusję o numerze: http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

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

+0

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

+2

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