Implémentation d'arrêt et de redémarrage dans le transfert de flux de fichiers - Comment? C # .net

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

  •  28-10-2019
  •  | 
  •  

Question

Je recherche des textes ou des conseils sur la mise en œuvre de l'arrêt et du redémarrage dans le transfert de flux de fichiers.

L'objectif est que l'application utilise une seule source de lecture et la sortie vers plusieurs sources d'écriture, et de pouvoir redémarrer à partir d'une position enregistrée si un transfert échoue.

L'application est écrite en C # .net.

Code pSuedo:

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

J'ai besoin de pouvoir mettre en œuvre un arrêt ou une pause. Ce qui pourrait fonctionner comme ça. Pour s'arrêter, continuer est marqué faux:

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

De toute évidence, à ce stade, je dois enregistrer le nombre d'octets lus et le nombre d'octets écrits à chaque source d'écriture.

Mes questions sont:

Si je devais enregistrer les octets de lecture et l'utiliser pour les redémarrages, un ou plusieurs écrivains auraient pu écrire tandis que d'autres ne l'ont pas fait. Le simple redémarrage en utilisant une mesure de la progression de la lecture pourrait corrompre les données écrites. J'ai donc besoin d'utiliser un enregistrement des «octets écrits par écrivain comme ma nouvelle position de départ. Comment puis-je être sûr que les octets ont été écrits (je n'ai peut-être pas la possibilité de lire le fichier de la source d'écriture pour lire la longueur du fichier)?

Quelqu'un peut-il me conseiller ou me diriger dans la bonne direction d'un texte sur ce type de problème?

Était-ce utile?

La solution

Utilisez un événement de synchronisation de thread.

(pseudocode):

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 bonne chose est que le fil d'écrivain ne consommera aucun processe Thread.Sleep())

L'autre note est que tout chèque doit être le première argument dans le while puisque reader.Read() Lire dans le flux autrement (mais le contenu sera ignoré car le drapeau empêchera le bloc While d'être exécuté).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top