Закройте C # / C ++ DLLImport или, по крайней мере, освободите его память из кучи? [закрыто]
У меня есть приложение C # .NET Framework, которое вызывает неуправляемую C ++ DLL через DLLImport
, чтобы проанализировать кучу файлов, предоставленных пользователем, и выполнить некоторые операции.
Я хотел бы иметь индикатор выполнения в моем приложении C #, так как этот синтаксический анализ файла может оказаться долгим процессом. Лучший способ, который я придумал для этого, - это анализировать несколько файлов за раз, а затем возвращаться к коду C #, чтобы я мог обновить индикатор выполнения.
Однако это требует от меня выделения некоторой памяти в куче C ++ DLL, поэтому мне не нужно передавать все 10000+ путей к файлам в качестве аргументов каждый раз, когда мне нужно снова вызывать функцию C ++.
Я не уверен, возможно ли закрыть DLL после завершения синтаксического анализа. Есть ли другой способ выполнить эту задачу, не сохраняя все пути в памяти, выделенной на все время работы приложения?
Ответы
Поскольку вы подтвердили независимость файлов, попробуйте распараллелить операцию.
На стороне производителя процесса настройте список или массив с именами файлов. Если список становится слишком большим (на самом деле, ДЕЙСТВИТЕЛЬНО большим, поэтому он нагружает доступную оперативную память), вы можете заменить его комбинацией BlockingCollection и Queue, чтобы производитель мог регулироваться, пока количество элементов в конвейере обработки не станет ниже порогового .
На другой стороне этого канала запустите рабочий (встроенный или как отдельный рабочий поток), который будет либо последовательно, либо .AsParallel () читать элементы из коллекции и передавать их в неуправляемую библиотеку для обработки.
Поскольку это приложение с пользовательским интерфейсом, я думаю, ваш рабочий поток должен быть отдельным. После каждого обработанного файла выполните .Invoke () в форме пользовательского интерфейса, чтобы обновить индикатор выполнения.