Comment puis-je afficher efficacement l'état d'un fichier lors de l'utilisation d'un fil d'arrière-plan?Afficher efficacement l'état du fichier lors de l'utilisation du fil d'arrière-plan
Par exemple, permet de dire que j'ai un fichier de 100 Mo:
quand je fais le code ci-dessous via un fil (comme un exemple) fonctionne dans environ 1 min:
foreach(byte b in file.bytes)
{
WriteByte(b, xxx);
}
Mais. .. si je veux mettre à jour l'utilisateur je dois utiliser un délégué pour mettre à jour l'interface utilisateur du thread principal, le code ci-dessous prend - FOREVER - littéralement je ne sais pas combien de temps im encore en attente, ive créé ce poste et son pas même 30% fait.
int total = file.length;
int current = 0;
foreach(byte b in file.bytes)
{
current++;
UpdateCurrentFileStatus(current, total);
WriteByte(b, xxx);
}
public delegate void UpdateCurrentFileStatus(int cur, int total);
public void UpdateCurrentFileStatus(int cur, int total)
{
// Check if invoke required, if so create instance of delegate
// the update the UI
if(this.InvokeRequired)
{
}
else
{
UpdateUI(...)
}
}
Pour les mesures de temps relatives dans une boucle, il est préférable d'utiliser 'Stopwatch' ou même' DateTime.UtcNow', qui sont beaucoup plus rapides que 'DateTime.Now'. –
Bon point. Je n'ai pas non plus réalisé que DateTime.UtcNow est plus rapide (aucune conversion de fuseau horaire). C'est toujours un plaisir d'apprendre quelque chose en répondant à autre chose! Vous pouvez également utiliser un System.Timer pour mettre à jour l'interface utilisateur, en particulier si le travail est effectué sur un autre thread. –
J'aime cette approche le meilleur jusqu'à présent, merci ebpower – schmoopy