Закройте C # / C ++ DLLImport или, по крайней мере, освободите его память из кучи? [закрыто]

Jan 15 2021

У меня есть приложение C # .NET Framework, которое вызывает неуправляемую C ++ DLL через DLLImport, чтобы проанализировать кучу файлов, предоставленных пользователем, и выполнить некоторые операции.

Я хотел бы иметь индикатор выполнения в моем приложении C #, так как этот синтаксический анализ файла может оказаться долгим процессом. Лучший способ, который я придумал для этого, - это анализировать несколько файлов за раз, а затем возвращаться к коду C #, чтобы я мог обновить индикатор выполнения.

Однако это требует от меня выделения некоторой памяти в куче C ++ DLL, поэтому мне не нужно передавать все 10000+ путей к файлам в качестве аргументов каждый раз, когда мне нужно снова вызывать функцию C ++.

Я не уверен, возможно ли закрыть DLL после завершения синтаксического анализа. Есть ли другой способ выполнить эту задачу, не сохраняя все пути в памяти, выделенной на все время работы приложения?

Ответы

3 RomanPolunin Jan 15 2021 at 05:35

Поскольку вы подтвердили независимость файлов, попробуйте распараллелить операцию.

На стороне производителя процесса настройте список или массив с именами файлов. Если список становится слишком большим (на самом деле, ДЕЙСТВИТЕЛЬНО большим, поэтому он нагружает доступную оперативную память), вы можете заменить его комбинацией BlockingCollection и Queue, чтобы производитель мог регулироваться, пока количество элементов в конвейере обработки не станет ниже порогового .

На другой стороне этого канала запустите рабочий (встроенный или как отдельный рабочий поток), который будет либо последовательно, либо .AsParallel () читать элементы из коллекции и передавать их в неуправляемую библиотеку для обработки.

Поскольку это приложение с пользовательским интерфейсом, я думаю, ваш рабочий поток должен быть отдельным. После каждого обработанного файла выполните .Invoke () в форме пользовательского интерфейса, чтобы обновить индикатор выполнения.