2012-08-28 23 views
5

Estoy trabajando en un proyecto de Dot Net, que incluye una DLL. Esta DLL usa un .lib (código C). Desafortunadamente, hay muchas variables estáticas en este .lib. El problema que tengo aquí:DotNet: variables estáticas en DLL

Si dos usuarios realizan una búsqueda al mismo tiempo, me sale un error, porque ambos acceden a .lib, uno cambia algo mientras que otros intentan leer datos.

La solución obvia sería bloquear el acceso, pero realmente no quiero hacer eso, porque eso ralentiza drásticamente el proceso de búsqueda. Preferiría intentar hacer una DLL desde la lib, pero no sé si esto resolvería el problema, ya que no sé si las variables estáticas se almacenarán por separado, o si ambos procesos de búsqueda tendrán acceso al mismo variables.

¿Alguien tiene experiencia con esto? Porque tomará bastante tiempo hacer esto, y me gustaría saber si funciona antes de comenzar a hacer esto.

Espero que todo sea comprensible, ya que el inglés no es mi primer idioma, y ​​mis habilidades de programación son bastante básicas.

+0

Usted * debe * evitar el uso excesivo de los campos * estáticos *. Intenta cambiar el diseño * Type *. – adatapost

+1

El problema es que el código C está lleno de estática, tomaría demasiado tiempo cambiarlo todo. La única alternativa rápida que veo es ATM, está probando este "truco" de DLL. – Stefan

+0

@Stefan: defina un nuevo tipo en un nuevo conjunto que tenga acceso a ese código C (y solo a él), en otras palabras, un contenedor para él. Adn desde ese tipo, administre el acceso exclusivo a los recursos de C de la manera que desee. Entonces, si quieres llamar a alguna función C, tienes que usar ese tipo, y si llamas a algo en mitad de la ejecución, el mismo tipo te bloqueará, generará una excepción, mostrará un mensaje ... lo que sea. – Tigran

Respuesta

1

Por lo que entiendo, no hay forma de que pueda editar los datos mientras está leyendo con las clases existentes dentro de este .dll. Claramente esto simplemente no funcionará, no importa qué cosas de lujo estés haciendo.

Lo que podría hacer es crear un Thunking Layer. Este será un tipo de clase contenedora que se llamará en lugar de .dll. Esta clase manejará las solicitudes de E/S simultáneas manteniendo una copia local de los datos para las lecturas, y permitiendo ediciones exhaustivas de los datos reales, actualizando la copia local cuando se finalicen estas manipulaciones (con el bloqueo temporal adecuado, etc.). Puede que haya otras formas estándar de hacer esto que yo no sepa, pero así es como comenzaría.

Espero que esto ayude.

+0

La idea sería que cada usuario tendrá su propia versión de la DLL en ejecución. Ahora el problema es que no sé si en Dot Net las variables estáticas se compartirán o no entre los usuarios. Pero gracias por el enlace, lo investigaré, ¡suena interesante! – Stefan

+1

@Stefan Las variables estáticas en '.NET Framework' se comparten entre todos los usuarios de la aplicación de la que forman parte estas variables. Si crea una capa adicional para exponer estos datos, puede ayudar, pero no estoy seguro de ello. – harry180