viernes, 4 de junio de 2010

FileSystemWatcher: Pérdida de notificaciones

En días pasados hemos tenido que lidiar con otra de esas chapuzas que tienen a bien ponernos los majetes de Microsoft. Como dice el título de la entrada, se trata del FileSystemWatcher.

La idea del objeto es muy buena a la par que útil: "escucha" las notificaciones de cambios en el sistema de archivos y provoca eventos. Así te evitas el tener que poner un Timer para que consulte cada determinado tiempo un directorio buscando nuevos ficheros.

El problema viene por la forma en la que funciona, o mejor dicho en la forma en falla cuando no funciona. Y es que si el número de cambios es muy elevado, el señor sólo registra una cantidad de ellos, perdiendo el resto en el limbo de los justos.

El resultado de esto es que el objeto sigue funcionando normalmente, y si caen nuevos ficheros los detecta y notifica, pero aquellos que llegaron en una tanda numerosa y cuya llegada no se registró, seguirán en el mismo sitio sin que repare en ellos hasta que vuelvan a sufrir algún cambio -como por ejemplo moverlos a otro directorio y a continuación volver a dejarlo en el mismo-.

Lo mejor es que según la ayuda de MSDN, "por dependencias con el sistema operativo Windows, FileSystemWatcher no provoca un evento Error cuando falta un evento o cuando se supera el tamaño del búfer."

Vamos, que te lo cuentan como si la cosa no fuese con ellos, y como si el sistema operativo Windows lo hubiese programado algún desalmado que nada tiene que ver con los de MSDN.

Nosotros hemos tenido problemas cuando han llegado más de 800 ficheros de la misma tacada, así que hemos ampliado el parámetro que sugiere la ayuda -InternalBufferSize-, pero poco, que por lo visto también es malo ponerlo muy grande. Además hemos capturado el evento Error, que en contra de lo que dice la ayuda sí se dispara cuando se desborda el buffer. De esta forma gestionamos el error y al menos damos un aviso para ver qué ha pasado, ya que de otra forma pasa totalmente desapercibido.

No hay comentarios: