Mientras cerraduras basadas hilo puede solucionar esto, hay una manera que funciona a través de hilos, pero es probablemente el más utilizado cuando tiene varios procesos de escritura hasta el final de un solo archivo.
Para obtener este comportamiento en los procesos (o subprocesos también), especifique que desea escribir anexos atómicos en el sistema operativo cuando se crean los identificadores de archivos del sistema operativo. Esto se hace especificando O_APPEND en Posix (Linux, Unix) y FILE_APPEND_DATA en Windows.
En C# no llama directamente al sistema operativo 'abierto', o 'Crear archivo' directamente al sistema, pero hay formas de obtener este resultado.
me preguntó cómo hacer esto en Windows hace un tiempo, y tiene dos buenas respuestas aquí: How can I do an atomic write/append in C#, or how do I get files opened with the FILE_APPEND_DATA flag?
Básicamente, se puede utilizar FileStream() o PInvoke, sugeriría FileStream() sobre PInvoke por razones obvias .
Puede usar argumentos de constructor para FileStream() para especificar E/S de archivo asíncrono además del indicador FileSystemRights.AppendData, que le debe proporcionar tanto E/S asíncrona como anotaciones de adición atómica a un archivo.
Advertencia: Algunos sistemas operativos tienen límites en el número máximo de bytes que pueden escribirse atómicamente de esta manera, y exceder ese umbral eliminará la promesa de atomicidad del sistema operativo.
Debido a este último problema, recomendaría seguir con la administración de contención de estilo lock() al tratar de resolver su problema en un solo proceso.
Esto no parece abordar la cuestión, el tema "golpea juntos". –
Sí, ¿cómo evitar que las escrituras asincrónicas colisionen? –
De la misma manera que maneja cualquier contención de recursos en un sistema de subprocesos múltiples. Cabellos. ReadWriterLock (o ReaderWriterLockSlim con 4.0/Parallel Extensions + 3.5) permite que se realicen varias lecturas al mismo tiempo, por lo que si eso es algo que desea, úselo. –