¿Cerrar una importación de DLL de C # / C ++ o al menos desasignar su memoria de pila? [cerrado]

Jan 15 2021

Tengo una aplicación C # .NET Framework que llama a una DLL de C ++ no administrada a través de DLLImport, para analizar un montón de archivos proporcionados por el usuario y realizar algunas operaciones.

Me gustaría tener una barra de progreso en mi aplicación C #, ya que este análisis de archivos puede ser un proceso largo. La mejor manera que he pensado de hacer esto es analizar un par de archivos a la vez y luego volver al código C # para poder actualizar la barra de progreso.

Sin embargo, esto requiere que asigne algo de memoria en el montón de la DLL de C ++ para no tener que pasar todas las más de 10,000 rutas de archivo como argumentos cada vez que tengo que volver a llamar a la función C ++.

No estoy seguro de si es posible cerrar la DLL después de haber completado mi análisis. ¿Hay alguna otra forma en que pueda realizar esta tarea sin tener que mantener todas las rutas en la memoria asignadas durante la totalidad del tiempo que la aplicación se está ejecutando?

Respuestas

3 RomanPolunin Jan 15 2021 at 05:35

Dado que ha confirmado que los archivos son independientes, debe intentar paralelizar la operación.

En el lado del productor del proceso, configure una lista o una matriz con nombres de archivo. Si la lista se vuelve demasiado grande (realmente, REALMENTE grande por lo que hace hincapié en la RAM disponible), es posible que desee reemplazarla con una combinación de BlockingCollection y Queue, por lo que el productor puede ser limitado hasta que el número de elementos en la tubería de procesamiento esté por debajo del umbral .

En el otro lado de esta tubería, inicie un trabajador (en línea o como subproceso de trabajo separado) que leerá secuencialmente o .AsParallel () los elementos de la colección y los pasará a la biblioteca no administrada para su procesamiento.

Dado que esta es una aplicación de interfaz de usuario, supongo que su hilo de trabajo debería estar separado. En cada archivo procesado, haga un .Invoke () en el formulario de la interfaz de usuario para actualizar la barra de progreso.