Zamknąć import DLL C # / C ++ lub przynajmniej zwolnić jego pamięć sterty? [Zamknięte]
Mam aplikację C # .NET Framework, która wywołuje niezarządzaną bibliotekę DLL C ++ przez DLLImport
, aby przeanalizować zbiór plików podanych przez użytkownika i wykonać pewne operacje.
Chciałbym mieć pasek postępu w mojej aplikacji C #, ponieważ analizowanie tego pliku może być długim procesem. Najlepszym sposobem, w jaki pomyślałem, aby to zrobić, jest przeanalizowanie kilku plików naraz, a następnie powrót do kodu C #, aby zaktualizować pasek postępu.
Wymaga to jednak przydzielenia trochę pamięci na stercie biblioteki DLL C ++, więc nie muszę przekazywać wszystkich ponad 10000 ścieżek plików jako argumentów za każdym razem, gdy muszę ponownie wywoływać funkcję C ++.
Nie jestem pewien, czy zamknięcie biblioteki DLL po zakończeniu analizowania jest możliwe. Czy istnieje inny sposób wykonania tego zadania bez konieczności utrzymywania wszystkich ścieżek w pamięci przydzielonej przez cały czas działania aplikacji?
Odpowiedzi
Ponieważ potwierdziłeś, że pliki są niezależne, powinieneś spróbować zrównoleglenie operacji.
Po stronie producenta procesu skonfiguruj listę lub tablicę z nazwami plików. Jeśli lista stanie się zbyt duża (naprawdę, NAPRAWDĘ duża, więc obciąża dostępną pamięć RAM), możesz chcieć ją zastąpić kombinacją BlockingCollection i Queue, aby producent mógł zostać dławiony, dopóki liczba elementów w potoku przetwarzania nie spadnie poniżej progu .
Po drugiej stronie tego potoku uruchom proces roboczy (wbudowany lub jako oddzielny wątek roboczy), który będzie odczytywał elementy z kolekcji sekwencyjnie lub .AsParallel () i przekaże je do niezarządzanej biblioteki w celu przetworzenia.
Ponieważ jest to aplikacja interfejsu użytkownika, myślę, że twój wątek roboczy powinien być oddzielny. Po każdym przetworzonym pliku wykonaj .Invoke () w formularzu interfejsu użytkownika, aby zaktualizować pasek postępu.