Zamknąć import DLL C # / C ++ lub przynajmniej zwolnić jego pamięć sterty? [Zamknięte]

Jan 15 2021

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

3 RomanPolunin Jan 15 2021 at 05:35

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.