Używam zewnętrznego komponentu, który okresowo uruchamia zdarzenia z wątku roboczego. W moim programie obsługi zdarzeń używam Dispatchera do wywołania metody w głównym wątku. Działa to ładnie ...Zakleszczenie, gdy wątek roboczy próbuje wywołać coś w głównym wątku
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
Jednak, gdy program zostanie zamknięty, a zewnętrzny komponent Dispose() s, programu czasami zawiesza się (i można zobaczyć i zabity w menedżerze zadań tylko).
Kiedy patrzę na to, co się dzieje, wygląda na to, że "komponent" czeka na powrót zdarzenia w wątku głównym (pozostaje w metodzie Dispose()), podczas gdy wątek roboczy oczekuje na wywołanie przez dyspozytora wspomniane wywołanie do głównego wątku (zawiesza się w linii dispatcher.Invoke-line).
Na razie rozwiązałem problem z zamykaniem systemu przez dodanie limitu czasu do Invoke, który wydaje się działać, ale czuje się źle. Czy istnieje lepszy sposób na zrobienie czegoś takiego? Czy mogę wymusić, aby główny wątek zabrał trochę czasu na zadania z innych wątków przed zamknięciem?
Próbowałem „Disconnect” zdarzenie przed zamknięciem, ale to nie pomaga, bo dyspozytor jest (może być) już czeka, kiedy program rozpocznie się zamknąć ...
PS: Komponent zewnętrzny oznacza tutaj, że nie mam dostępu do kodu źródłowego ...
Proszę używać akapity następnym razem – Shai
Wklejenie kodu będzie bardzo pomóc – Vedran