Implementazione di arresto e riavvio nel trasferimento del flusso di file - Come? C# .NET
-
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?
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).