GC.Collect
pojawia się, aby rozpocząć odśmiecanie w wątku tła, a następnie natychmiast powrócić. Jak mogę synchronicznie uruchomić GC.Collect
- czyli czekać na zakończenie czyszczenia pamięci?Uruchom GC.Collect synchronicznie
Jest to w kontekście testów NUnit. Próbowałem dodać ustawienie gcConcurrent do pliku app.config mojego zestawu testowego i próbowałem tego samego z plikiem nunit.exe.config. Żaden z nich nie przyniósł żadnego efektu - podczas debugowania nadal widzę, jak finalizator działa na "wątku GC Finalizer", a nie wątku o nazwie GC.Collect
("TestRunnerThread" NUnita), a oba wątki działają jednocześnie.
Tło: Chcę, aby moje testy zakończyły się niepowodzeniem, jeśli wyciekną (nie wywołuj Dispose) określonej klasy. Dlatego dodałem finalizator do tej klasy, która ustawia statyczną flagę: wasLeaked
; następnie mój test TearDown wywołuje GC.Collect()
, a następnie wyrzuca, jeśli wasLeaked
jest prawdziwy. Nie determinuje to jednak deterministycznie, ponieważ kiedy czyta się wasLeaked
, finalizator zwykle jeszcze nie został jeszcze wywołany. (To nie późniejszym testu zamiast po zbieranie śmieci wreszcie zakończy.)
Idealny! Właśnie tego szukałem. Dzięki! –