2011-07-25 12 views
5

Muszę zakończyć zatrzymany wątek, ustawię IsBackground jako prawdziwy, ale pozostanie przy życiu. Właściwości wątku:Zabij wątek, naprawdę!

ThreadState = AbortRequested

IsBackground = true

Kiedy zbadać zamrożoną miejsce znajdę linię poniżej:

resultDetect = Detect(input, ref output); 

Plamka jest 3rd party kod (Method Detect). Wątek aktualizuje tylko resultDetect, jak widzisz. Muszę przerwać ten wątek i ponownie uruchomić nowy, aby kontynuować. W przeciwnym razie aplikacja czeka i nic nie robi - świeży wynikDetect potrzebny -

Jak mogę zabić nici, która nie umiera?

Odpowiedz

4

Istnieje tylko jeden sposób bezpiecznego zabicia zawieszonego wątku w aplikacji: Environment.Exit A nawet to może się nie powieść, jeśli wątek jest uruchomiony z kodem jądra.

Najlepiej nie używać kodu innej firmy, który się zawiesza. Jeśli nie masz wyboru, uruchom go w oddzielnym procesie.

+0

To już jest po stronie serwera kodu. Metoda skanuje dużą ilość danych (~ 1 GB pamięci RAM). Jak mogę rozpocząć nowy proces w super szybki sposób? Powiedzmy, że podzielę stronę serwera na sekcję bazy/pamięci i sekcję skanowania ... Więc mogę zabić sekcję skanowania. Chyba zadam nowe pytanie. –

+1

@Nime: Nie ma prawie wystarczająco dużo szczegółów, aby kontynuować, ale wspomnę, że ['MemoryMappedFile'] (http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile. aspx) klasa umożliwia współdzielenie pamięci między procesami, więc jest to szybki sposób nadania procesowi skanowania dostępu tylko do odczytu do uchwytu danych, a jednocześnie jest w stanie go zabić niezależnie od głównego procesu. –

2

Jeśli Detect przejścia do kodu niezarządzanego następnie CLR będzie odroczyć wstrzyknięcie ThreadAbortException aż powróci. To zachowanie zmieniło się w .NET 2.0, aby przerywanie wątku było o wiele bezpieczniejsze. Środowisko CLR bardzo stara się ochronić przed uszkodzeniem stanu procesu, co byłoby bardzo prawdopodobne w przypadku niezarządzanego kodu, ponieważ nie można uzyskać korzyści z izolacji domen aplikacji, które można łatwo wyładować w ramach całego zarządzanego scenariusza . Naprawdę, jedynym rozwiązaniem jest uruchomienie tego API w oddzielnym procesie i użycie WCF, zdalnej komunikacji itp. Do komunikacji z nim.