Salut les gars J'ai essayé de copier certains fichiers avec ce code Tout est bon et que l'application copiera des fichiers mais en progrès de copie, je ne peux pas bouger mon application ou faire quoi que ce soit J'ai essayé d'utiliser le fil mais c'est ne fonctionne pas, je n'utilise pas aussi un travail d'arrière-plan mais toujours rien le seul contrôle qui ne gêne pas Stuckbar Son fonctionne bien ici est mon code:
public Form1() { InitializeComponent(); backgroundWorker1.Dispose(); backgroundWorker1.DoWork += BackgroundWorker_DoWork; backgroundWorker1.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted; backgroundWorker1.ProgressChanged += BackgroundWorker_ProgressChanged; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker2.DoWork += BackgroundWorker2_DoWork; backgroundWorker2.WorkerReportsProgress = true; } private void BackgroundWorker2_DoWork(object sender, DoWorkEventArgs e) { File.Copy(sourcePath, targetPath); } private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < fileSize; i++) { int p = (i + 1) * 100 / Convert.ToInt32(fileSize); backgroundWorker1.ReportProgress(p); } } private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { lbProgress.Text = e.ProgressPercentage.ToString(); progressBar1.Value = e.ProgressPercentage; } private void btnTarget_Click(object sender, EventArgs e) { folderBrowser = new FolderBrowserDialog(); if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK) { targetPath += folderBrowser.SelectedPath + @"\" + fileName; lbTarget.Text = targetPath; } } private void btnSource_Click(object sender, EventArgs e) { op = new OpenFileDialog(); if (op.ShowDialog() == DialogResult.OK) { sourcePath += op.FileName; lbSource.Text = sourcePath; fileInfo = new FileInfo(sourcePath); fileSize = fileInfo.Length / 1024; fileName = fileInfo.Name; MessageBox.Show(string.Format("File size is: {0} KB", fileSize)); } } private void btnCopy_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); backgroundWorker2.RunWorkerAsync(); }
3 Réponses :
Pour tester J'ai créé une application WinForm simple avec un bouton, une étiquette et un ouvrier d'arrière-plan et a ajouté les événements correspondants suivants: fonctionne comme prévu. p> p >
Vous mettez à jour la barre de progression plus rapidement que la mise à jour de l'interface utilisateur, pour chaque octet du fichier en cours de copie dans une boucle serrée. Vous inondez le fil d'interface utilisateur avec un travail inutile. p>
Supprimer Backworker1 Code>, ce n'est pas quelque chose d'utile de toute façon. Si vous n'avez pas de moyen de suivre la progression (que vous n'ayez pas avec
fichier.copy.copy.copy code>), utilisez simplement une barre de progression sans progression (style de jeu pour chapitle). P>
Pourriez-vous essayer de mettre à jour votre dowork à ce sujet:
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { int mainProgress = 0; for (int i = 0; i < fileSize; i++) { int calculatedProgress = (i + 1) * 100 / Convert.ToInt32(fileSize); if(calculatedProgress > mainProgress) { mainProgress = calculatedProgress; backgroundWorker1.ReportProgress(mainProgress); } } }
Quel est le point de
backworker_dowork code>? Cela ne fait rien d'utile.
Les bogues de codage sont généralement assez faciles à réparer. Mais ceci est un bug-bogue, cela va prendre un moment et vous ne pouvez pas apprendre à écrire correctement le code fileté d'un message. Le meilleur moyen à venir est de savoir comment les autres programmeurs font cela. Google "Formulaires Windows Fichier de copie en arrière-plan".
@Hanspassant désolé homme im nouveau à c # :)
Pourquoi vous attendez-vous à ce qu'un ouvrier de fond disposé soit utile de faire quelque chose d'utile?
@mjwills a raison, votre backworker_dowork est un peu inutile. Cela ne signalent aucun progrès, il met simplement à jour la barre d'UI Progress X fois (X étant FILLESIZE).