¿Es QueueUserWorkItem con la implementación correcta de bloqueo?

He implementado un método de registro de la siguiente manera:

 ThreadPool.QueueUserWorkItem((state) => {
    lock (appendLock) {
       using (StreamWriter log = File.AppendText(_logFile)) {
          log.WriteLine(message);
       }
    }
 }, null);

1: es el lock ¿necesario? Quería enhebrar el registro y encontré que el bloqueo ya estaba en su lugar. Entonces, en lugar de alterar ese código, simplemente lo envolví en un delegado trabajador.

2: suponiendo que se requiere el bloqueo: ¿es esta la implementación correcta para poner en cola al delegado que contiene un bloqueo? El potencial es razonablemente alto de que varios subprocesos podrían solicitar escrituras de registro. Al poner en cola el delegado en un subproceso de trabajo, la duración de una ejecución de E/S de archivo no debería afectar a la propia aplicación.

3: asumir varios logWriteDelegate trabajadores han sido encolados: ¿Se invocará a los delegados en la orden en que fueron recibidos? es decir, Ahora sirviendo #32 ... Ahora sirviendo #33

preguntado el 28 de julio de 12 a las 16:07

1 Respuestas

1: sí, es necesario bloquearlo. Múltiples subprocesos pueden acceder a él, especialmente porque está utilizando el grupo.

2: bueno, funcionará. Pero mantendrá el archivo bloqueado, lo que dificultará su lectura. Hay marcos de registro preexistentes que han trabajado mucho en este problema; puede valer la pena usarlos.

3: no; con la cerradura y el grupo, son dos razones separadas para no esperar un orden estricto en el archivo final. De hecho, debido a la piscina, un hilo único los mensajes pueden aparecer desordenados. Si desea realizar un pedido, deberá escribir en una cola (sincronizada) y tener un trabajador dedicado que extraiga los datos (sincronizados) de la cola y los escriba en el archivo de registro. Nuevamente, los marcos de registro existentes habrán resuelto esto por usted.

Respondido 28 Jul 12, 16:07

Desafortunadamente, los marcos de registro existentes están fuera de discusión debido a las licencias, el código abierto y otros obstáculos legales. Simplemente significa que necesito proporcionar un mecanismo de registro seguro para subprocesos. Mantener el archivo bloqueado está bien ... los registros normalmente no son leídos por ninguno de los usuarios (a menos que haya entendido algo mal). - Resumen

Gracias por la información: reelaboré para agregar una cola que pone en cola un registro Action que es monitoreado por un Task objeto. La puesta en cola y la eliminación de cola están sincronizadas en un lockQueue objeto como el Queue<T> no tiene un objeto de sincronización. - Resumen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.