Einen C # / C ++ - DLLImport schließen oder zumindest seinen Heapspeicher freigeben? [geschlossen]

Jan 15 2021

Ich habe eine C # .NET Framework-Anwendung, die eine nicht verwaltete C ++ - DLL über aufruft DLLImport, um eine Reihe von vom Benutzer angegebenen Dateien zu analysieren und einige Vorgänge auszuführen.

Ich möchte einen Fortschrittsbalken in meiner C # -Anwendung haben, da das Parsen von Dateien möglicherweise ein langer Prozess ist. Der beste Weg, dies zu tun, besteht darin, mehrere Dateien gleichzeitig zu analysieren und dann zum C # -Code zurückzukehren, damit ich den Fortschrittsbalken aktualisieren kann.

Dies erfordert jedoch, dass ich Speicher auf dem Heap der C ++ - DLL reserviere, damit ich nicht jedes Mal, wenn ich die C ++ - Funktion erneut aufrufen muss, alle über 10.000 Dateipfade als Argumente übergeben muss.

Ich bin nicht sicher, ob das Schließen der DLL nach Abschluss meiner Analyse möglich ist. Gibt es eine andere Möglichkeit, diese Aufgabe auszuführen, ohne dass alle Pfade im Speicher für die gesamte Zeit, in der die Anwendung ausgeführt wird, zugewiesen bleiben müssen?

Antworten

3 RomanPolunin Jan 15 2021 at 05:35

Da Sie bestätigt haben, dass Dateien unabhängig sind, sollten Sie versuchen, den Vorgang zu parallelisieren.

Richten Sie auf der Herstellerseite des Prozesses eine Liste oder ein Array mit Dateinamen ein. Wenn die Liste zu groß wird (wirklich WIRKLICH groß, um den verfügbaren Arbeitsspeicher zu belasten), können Sie sie durch eine Kombination aus BlockingCollection und einer Warteschlange ersetzen, damit der Produzent gedrosselt werden kann, bis die Anzahl der Elemente in der Verarbeitungsleitung unter dem Schwellenwert liegt .

Starten Sie auf der anderen Seite dieser Pipe einen Worker (inline oder als separater Worker-Thread), der entweder nacheinander oder .AsParallel () Elemente aus der Sammlung liest und sie zur Verarbeitung an die nicht verwaltete Bibliothek weiterleitet.

Da dies eine UI-Anwendung ist, sollte Ihr Worker-Thread getrennt sein. Führen Sie für jede verarbeitete Datei ein .Invoke () im UI-Formular aus, um den Fortschrittsbalken zu aktualisieren.