2011-11-07 21 views
12

Estoy creando una aplicación de Windows en C# en la que quiero escribir en un archivo múltiple con varios hilos. Recibo datos de diferentes puertos y hay un archivo asociado a cada puerto. Es posible que la creación de hilo para cada puerto y usar el mismo hilo una y otra vez para escribir datos en el archivo respectivo? Supongamos que obtengo datos de los puertos 10000,10001,10002 y que hay tres archivos como 10000.txt, 10001.txt y 10002.txt. Tengo que crear tres hilos para escribir datos en estos tres archivos, respectivamente, y quiero utilizar estos hilos una y otra vez. ¿Es posible? ¿Puedes dar una pequeña muestra de código si es posible?¿Cómo escribir en un solo archivo con múltiples hilos?

+4

necesita serializar el acceso al archivo (por ejemplo, un Mutex o similar) o tener un hilo central responsable de escribir el archivo que cada otro hilo simplemente le dice qué escribir (ponga en cola el trabajo a realizar por ese hilo central) ... – Yahia

+3

¿Por qué necesita escribir en un solo archivo desde múltiples hilos? Esta es una mala idea, no solo por la sincronización sino también por la mecánica de escribir en el archivo (bloqueos, etc.). – Oded

+0

Aquí estoy obteniendo datos de diferentes puertos continuamente y hay diferentes archivos. Tres es un archivo asociado con un solo puerto. Quiero escribir los datos que provienen de un puerto al archivo respectivo. Deseo crear un hilo para cada dato entrante. escribirá esa información en un archivo particular y lo abortará, y así sucesivamente. – Dany

Respuesta

10

Como se mencionó en los comentarios, esto está causando problemas.

Por lo tanto, es necesario tener una clase de escritor flujos seguros:

public class FileWriter 
{ 
    private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim(); 
    public void WriteData(/*....whatever */) 
    { 
     lock_.EnterWriteLock(); 
     try 
     { 
      // write your data here 
     } 
     finally 
     { 
      lock_.ExitWriteLock(); 
     } 
    } 

} // eo class FileWriter 

Esto es adecuado para ser llamado por muchos hilos. PERO, hay una advertencia. Puede haber una disputa de bloqueo. Utilicé una clase ReadWriterLockSlim, porque es posible que también desee realizar bloqueos de lectura e infierno, esa clase también le permite actualizar desde un estado de lectura.

+0

Gracias por responder, escribí solo un método para escribir en el archivo y paso solo parámetros diferentes para ese método. Pero si uso LOCK para el método de escritura, solo un hilo puede acceder a ese método. Esto no sirve para nada. yo. – Dany

+0

@Dany, varios hilos más + 1 archivo = malas noticias. ¿Cuál es tu caso de uso? –

+0

varios hilos más + 1 archivo no es mi caso. Mi caso es múltiples hilos y múltiples archivos. – Dany

0

Deberá serializar los hilos y gestionar el cierre y la apertura de las llamadas a archivos. Y probablemente use append en lugar de write ... Puede usar una clase de gestor de hilos (más como el hilo principal) para ayudar a sincronizar todos sus otros hilos. Aunque lo mejor probablemente sea usar un hilo dedicado para escribir en ese archivo ...

+0

Gracias por la respuesta, pero ¿puedo crear un hilo dedicado para un archivo en particular y otro hilo para otro archivo y así sucesivamente? – Dany

+0

@Dany: a menos que tenga un hilo que siempre esté ejecutándose, el mismo hilo manejará la escritura en cualquiera de sus archivos.Incluso la respuesta aceptada no generará un nuevo hilo para escribir en el archivo, solo evitará varios hilos, desde la escritura hasta el mismo archivo al mismo tiempo. –

3

Las respuestas a otras publicaciones están algo fuera de línea con su pregunta original: parece que desea escribir en un archivo diferente por subproceso.

La respuesta fácil es ... solo hazlo - el sistema de archivos es seguro para subprocesos. El único inconveniente puede ser el rendimiento con solo un disco. La escritura simultánea y rápida de pequeños fragmentos de datos en muchos archivos puede provocar una gran cantidad de problemas en el disco, ya que el sistema de archivos intenta manejar los archivos/directorios distribuidos con solo un brazo de rotor. Los discos duros modernos con cachés grandes y controladores inteligentes mitigarán esto hasta cierto punto, pero es posible que tenga un problema. Pruébalo y mira!

Sus problemas aumentarán si planea crear y destruir continuamente subprocesos, abrir y cerrar archivos de datos para cada lectura de red entrante. Si puedes evitar esto, hazlo.

Si el disco no puede mantener el ritmo, puede implementar su propio algoritmo inteligente de "escritura diferida" para aumentar el tamaño de las escrituras del disco y así reducir el número, o comprar un SSD, o ambos.

Cuestiones relacionadas