-1
votes

Pourquoi Winform se bloque-t-il avec Backworker?

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();
    }


5 commentaires

Quel est le point de backworker_dowork ? 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).


3 Réponses :


0
votes

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: xxx

fonctionne comme prévu.


0 commentaires

3
votes

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.

Supprimer Backworker1 , 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 ), utilisez simplement une barre de progression sans progression (style de jeu pour chapitle).


0 commentaires

0
votes

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);
        }
    }
}


0 commentaires