Implementación de paradas y reiniciar en la transferencia de transmisión de archivos: ¿cómo hacerlo? C# .NET

StackOverflow https://stackoverflow.com/questions/8398642

  •  28-10-2019
  •  | 
  •  

Pregunta

Estoy buscando textos o consejos sobre la implementación de detener y reiniciar en la transferencia de transmisión de archivos.

El objetivo es que la aplicación use una sola fuente de lectura y salga a múltiples fuentes de escritura, y pueda reiniciar desde una posición grabada si falla una transferencia.

La aplicación se está escribiendo en C# .net.

Código de psedo:

while (reader.Read())
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

Necesito poder implementar parar o pausa. Que podría funcionar así. Para detenerse, continuar está marcado Falso:

while (reader.Read() && Continue)
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

Claramente, en esta etapa, necesito registrar el número de bytes leídos y el número de bytes escritos en cada fuente de escritura.

Mis preguntas son:

Si solo tuviera que registrar los bytes de lectura y usar esto para reinicios, uno o más escritores podrían haber escrito mientras que otros no lo han hecho. Simplemente reiniciar utilizando una medida de progreso de lectura podría dañar los datos escritos. Así que necesito usar un registro de 'bytes escritos por escritor' como mi nueva posición de inicio. ¿Cómo puedo estar seguro de que se escribieron los bytes (es posible que no tenga la capacidad de leer el archivo de la fuente de escritura para leer la longitud del archivo)?

¿Alguien puede asesor o señalarme en la dirección correcta de un texto sobre este tipo de problema?

¿Fue útil?

Solución

Use un evento de sincronización de hilo.

(seudocódigo):

ManualResetEvent _canReadEvent = new ManualResetEvent(true);

public void WriterThreadFunc()
{
    while (_canReadEvent.Wait() && reader.Read())
    {
        foreach(writer in writers)
        {
            writer.WriteToStream();
        }
    }
}

public void Pause()
{
    _canReadEvent.Reset();
}

public void Continue()
{
    _canReadEvent.Set();
}

Lo bueno es que el hilo del escritor no consumirá ninguna CPU cuando se detenga y continuará directamente que está señalado (en lugar de usar una bandera y Thread.Sleep())

La otra nota es que cualquier cheque debe ser el primero argumento en el while ya que reader.Read() Se leerá en la transmisión de lo contrario (pero el contenido se ignorará ya que el indicador evitará que el bloque mientras se ejecute).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top