Problem:
Mam aplikację konsolową, która korzysta z zewnętrznej biblioteki, która korzysta z natywnej dllki. Gdy aplikacja się kończy mam wszystkie komunikaty ze swojego kodu, ale samo okno się nie zamyka (podejrzewam, że jako usługa też będzie wisieć). Zrzut pamięci ujawnił, że wszystkie wątki zostały zakończone oprócz jednego, którego lokalizacja wskazuje właśnie na ten natywny dll (okno Threads w Visual Studio). Najlepiej byłoby sprawić, żeby wątek sam się zakończył, ale obawiam się, że nie jestem władny aby to uczynić.
Aplikacja oparta jest na AutoFac. Lifetime scope tworzy dla mnie inna biblioteka i ona nim zarządza.
Próbowałem:
- Dobrać się do tego wątku w Dispose jednej z klas, ale jedyne co udało mi się otrzymać, to wątki systemowe, z którymi nic nie da się zrobić.
- Uruchamiać Environment.Exit() w Dispose()
- Uruchamiać Taska który po
Task.Delay().Wait()
robiCurrentProcess.Kill()
- Uruchamiać CurrentProcess.Kill() po
Thread.Sleep()
W obu powyższych przypadkach kod się nie uruchamia - podejrzewam, że aplikacja ubija/anuluje uruchomienie wątku, który ma czekać.
Znane mi rozwiązania:
-
Process.CurrentProcess.Kill()
w Dispose jednego z obiektów - działa, ale jest bardzo słabe - nie ma gwarancji w jakiej kolejności będą zwalniane obiekty - zewnętrzny exec odpalany na Dispose jednego z obiektów (dedykowanego myślę), który po odpowiednim okresie czasu ubije mój proces. To jest moje ostateczne rozwiązanie, które wdrożę, gdy wszystko inne zawiedzie
Czy ktoś z Pań i Panów programistów ma lepszy pomysł jak rozprawić się z tym wątkiem? Będę wdzięczny za wszelkie sugestie.