Implementazione di arresto e riavvio nel trasferimento del flusso di file - Come? C# .NET

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

  •  28-10-2019
  •  | 
  •  

Domanda

Sto cercando testi o consigli sull'implementazione di arresto e riavvio nel trasferimento del flusso di file.

L'obiettivo è che l'applicazione utilizzi un'unica fonte di lettura e uscirà a più sorgenti di scrittura ed essere in grado di riavviare da una posizione registrata se un trasferimento fallisce.

L'applicazione viene scritta in C# .NET.

Codice psuedo:

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

Devo essere in grado di implementare Stop o Pause. Che potrebbe funzionare così. Per fermarti, continuare è marcato falso:

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

Chiaramente in questa fase devo registrare il numero di byte letti e il numero di byte scritti a ciascuna fonte di scrittura.

Le mie domande sono:

Se dovessi registrare solo i byte di lettura e usarlo per il riavvio, uno o più scrittori avrebbero potuto scrivere mentre altri no. Il semplice riavvio utilizzando una misura dei progressi di lettura potrebbe corrompere i dati scritti. Quindi ho bisogno di usare un record "byte per scrittore" scritto come nuova posizione di inizio. Come posso essere sicuro che i byte siano stati scritti (potrei non avere la possibilità di leggere il file dalla sorgente di scrittura per leggere la lunghezza del file)?

Qualcuno può consulente o indicarmi nella giusta direzione di un testo su questo tipo di problema?

È stato utile?

Soluzione

Utilizzare un evento di sincronizzazione del thread.

(pseudocodice):

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();
}

La cosa buona è che il thread dello scrittore non consumerà alcuna CPU quando viene messo in pausa e continuerà direttamente è segnalato (invece di usare una bandiera e Thread.Sleep())

L'altra nota è che qualsiasi controllo dovrebbe essere il primo argomento nel while da reader.Read() Leggerà dal flusso altrimenti (ma il contenuto verrà ignorato poiché il flag impedirà l'esecuzione del blocco).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top