2012-08-23 5 views
5

Tworzę aplikację Windows Forms, aby wykonać kilka operacji na urządzeniu podłączonym przez USB. W przypadku wszystkich operacji, takich jak czytanie, pisanie i inne rzeczy, mamy niestandardową bibliotekę.Zatrzymaj wątek zablokowany na wywołanie blokowania

Operacja zapisu jest wykonywana, gdy użytkownik kliknie przycisk.

Aby odczytać, tworzony jest oddzielny wątek. Problem z dostępną biblioteką polega na tym, że rozmowa Read jest blokowana i ma limit czasu INFINITE.

W przypadku błędu połączenia, ten wątek zatrzymuje się na wywołaniu funkcji Read, ponieważ ta funkcja ulega uszkodzeniu tylko wtedy, gdy otrzyma dane.

Co może być sposobem na zabicie tego wątku w takim scenariuszu? Thread.Abort() nie działa.

Używam C# do tego programowania.

+1

Jeśli „zwyczaj biblioteka” nie przewiduje * każdy * oznacza anulować blokowanie odczytu na nieudanym związku, należy go wyrzucić i użyć czegoś innego, szczerze. – Clemens

+0

Wiem .... Chciałbym móc ... Ale tak samo jest z domyślną klasą portu szeregowego C# ... Operacja odczytu zostanie zatrzymana na nieudanym połączeniu, jeśli ustawię Timeout na Infinte. – Swanand

+0

Możesz spróbować zamknąć "uchwyt" do tego, co próbujesz odczytać z ... następnie odczyt zostanie anulowany Powinienem się domyślić ... i twoja nić w zależności od tego, jak to jest napisane może wyjść. –

Odpowiedz

1

Ta metoda odczytu prawdopodobnie wywołuje natywny kod, więc wątek nie może zostać przerwany. Nie ma sposobu (przynajmniej, że jestem obeznany), aby przerwać wątek, który używa współdziałania COM. Możesz sprawdzić, dlaczego metoda Read jest przede wszystkim blokująca wątek. Spróbuj sprawdzić wymagania przed wywołaniem metody Read.

Spójrz na to pytanie: Abort call to unmanaged DLL

+0

Prowadziłem to w oddzielnym procesie, który rozważałem. Myślałem również, że MOGĘ być w stanie uruchomić niebezpieczny kod w innej domenie aplikacji, który myślałem, że możesz "strzelać w głowę", ale ... cierpi z powodu tego samego niepowodzenia przerwania problemu z wątkiem, patrz: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

Dzięki za pomysł! Ale jak uruchomić tylko jeden wątek w innym procesie? LUB Uruchamianie funkcji jako innego procesu? – Swanand

+0

Możesz utworzyć kolejną aplikację, która zajmuje się COM interop (komunikacja USB) i uruchomić tę aplikację jako Process. Następnie można komunikować się z tym procesem za pośrednictwem potoków http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx –

Powiązane problemy