Wszystkie artykuły w Internecie mówią, że używanie Thread.Abort
jest złe (ponieważ prymitywy synchronizacji należą do systemu operacyjnego, a proces nie kończy się jeszcze, a prymitywy mogą pozostać zablokowane po przerwaniu wątku). Deweloperzy zalecają zamiast tego zakończyć całe procesy, ponieważ system operacyjny zwolni prymitywy synchronizacji po zatrzymaniu procesu.Smukłe klasy synchronizacji są na AppDomain lub na proces?
Will
AppDomain
rozładunek pomoc, Jeśli będzie użyćSlim
synchronizacji prymitywów? (W .net 4.0 dodano kilka nowych klas związanych z wątkami:ManualResetEventSlim
,SemaphoreSlim
,ReaderWriterLockSlim
).Dokumentacja mówi, że te prymitywy nie mogą być używane między różnymi procesami, ponieważ kod implementujący prymitywy jest w pełni zarządzany. Ale nie rozumiem - czy te prymitywy będą działały przez granicę
AppDomain
. (patrz Can't set synchronization context when using appdomains)- Jeśli tak, jak to robią? Jeśli nie, to dlaczego dokumentacja pomija to ograniczenie?
UPD: Cały mój kod jest mi zaufany, łącznie z kodem wewnątrz domeny, który rozładowuję. Nie chcę, aby wątek działał, kiedy nadejdzie czas, aby go zakończyć. Chcę zakończyć (przerwać) wątek zamiast "ustawiania flagi" i "tworzenia ładnej architektury". Jeśli jest to konieczne, aby utworzyć dodatkowy wątek pierwszy (myślę, że jest to konieczne na początku przetwarzania w tle w oddzielnej domenie, aby utworzyć jeszcze jeden wątek), zrobię to. Nie chcę używać podejścia "ustawianie flag", ponieważ wymaga mnie do algorytmu tła instrumentu z kontroli flagi, nie powinienem, to runtime lub kompilator powinien zautomatyzować tę oprzyrządowanie dla mnie. W tej chwili nie ma takiej oprzyrządowania, dlatego próbuję zastosować podejście z rozładowaniem domen.
Dodanie czeków między każdą instrukcją (lub w głęboko zagnieżdżonych cyklach) znacznie spowolni kod. Dodanie czeku w losowych lokalizacjach nie daje gwarancji szybkiego zakończenia. Jeśli trudności z pisaniem bezpiecznego kodu można rozwiązać, dlaczego nie spróbować przerwać wątki i rozładować domenę?
Jak byś je przez granicę AppDomain? Nie można ich przekształcać do postaci szeregowej, ani nie dziedziczą z 'MarshalByRefObject'. –
AppDomain rozwiązuje ten problem. Ale używanie prymitywów synchronizacji w aplikacjach nie działa, musisz mieć możliwość wyrzucenia * wszystkiego *. –
Jest więcej problemów związanych z opcją "Thread.Abort" niż te, o których wspomniałeś (w rzeczywistości niektóre prymitywy synchronizacji są wypuszczane dobrze z opcją "Thread.Abort', pod warunkiem, że wątek faktycznie umiera oczywiście). Pytanie brzmi, dlaczego próbujesz użyć agresywnej aborcji zamiast unieważniania? Wystarczy wysłać sygnał i niech wątek decyduje, kiedy można bezpiecznie przerwać. Pisanie bezpiecznego kodu jest znacznie trudniejsze niż zwykłego kodu wątku - zarówno dla zarządzanych, jak i natywnych zasobów. – Luaan