J'ai le délégué d'événement suivant qui prend essentiellement un tableau d'octets, et l'ajoute à un flux de fichiers. Une fois qu'il a écrit 1000 fois, qui est suivi par une variable locale counter
, je veux fermer le flux de fichiers en cours et en ouvrir un nouveau.Comment peut-on s'assurer que FileStream est éliminé après que toutes WriteAsync() sur le fichier en cours sont terminées?
J'ai lu la documentation de FileStream et suggéré d'utiliser FileStream.WriteAsync()
pour de meilleures performances.
public void WriteData(byte[] data)
{
counter++;
if (counter == 1000)
{
counter = 0;
// Close the current filestream and open a new one.
filestream.Dispose();
filestream = new FileStream(this.outputPath, FileMode.Create,
FileAccess.Write, FileShare.None, 4096, true);
}
filestream.WriteAsync(data, 0, data.Length);
}
Cependant, dans la fonction ci-dessus, mon hypothèse est que ce pourrait être le cas que tous les appels WriteAsync()
ont pas terminé avant d'appeler filestream.Dispose()
. Y a-t-il un moyen de m'assurer que je n'ai que Dispose()
après que tous mes appels WriteAsync()
aient été terminés? Notez que ce délégué d'événement est appelé de 1 000 à 2 000 fois par seconde et WriteAsync copie 240 Ko par appel sur un disque SSD.
Une solution que je peux penser est au lieu immédiatement la disposition de chaque Filestream
immédiatement, je peux stocker dans un tableau de Filestream
puis disposer une fois que je suis fini avec l'ensemble du processus d'écriture de données et plus d'événements sont cuisson. Cela fonctionnerait-il? Même alors, comment puis-je effectivement attendre que tous les appels WriteAsync()
soient terminés?
'await filestream.WriteAsync (...); filestream.Dispose; '? – Kritner
@Kritner Le flux n'est pas éliminé après chaque écriture. – Servy
Vous ne devriez pas avoir une méthode asynchrone 'void' comme ceci. Vous devriez toujours exposer à l'appelant un moyen de déterminer quand l'action asynchrone est terminée (dans ce cas, en retournant une 'tâche'). Notez qu'avec votre code actuel, non seulement vous pouvez vous débarrasser du flux pendant qu'une écriture est en cours, mais vous pouvez également envoyer une écriture supplémentaire alors qu'une écriture antérieure n'est pas encore terminée, ce qui * posera également des problèmes. – Servy