【问题标题】:C# progress bar not updating with backgroundworkerC# 进度条不与后台工作人员一起更新
【发布时间】:2014-07-23 08:00:00
【问题描述】:

我正在尝试创建一个加密/解密 GUI,并且我拥有我想要的所有功能。问题是我在加密文件时试图让进度条运行。我在网上搜索了一些文章,他们都告诉我使用 backgroundWorker,这样进度条就可以在单独的线程上运行,而不会冻结 UI 界面。但是,我似乎无法让进度条显示任何内容。

public partial class Form1 : Form
{
   static string key = "";
   cSecureData ed = new cSecureData(key);

   public Form1()
    {
        InitializeComponent();
        InitializeEncryptBG();
    }

    private void InitializeEncryptBG()
    {
        encryptBG.DoWork += new DoWorkEventHandler(encryptBG_DoWork);
        encryptBG.RunWorkerCompleted += new RunWorkerCompletedEventHandler(encryptBG_RunWorkerCompleted);
        encryptBG.ProgressChanged += new ProgressChangedEventHandler(encryptBG_ProgressChanged);
    }

   private void btnEncrypt_Click(object sender, EventArgs e)
   {
        this.btnEncrypt.Enabled = false;
        this.btnDecrypt.Enabled = false;
        /*if (Rijndael.Checked == true)
        {
            ed.EncryptFile(textBox1.Text, textBox2.Text, "1");
        }
        else if (TripleDES.Checked == true)
        {
            ed.EncryptFile(textBox1.Text, textBox2.Text, "2");
        }*/
        encryptBG.RunWorkerAsync();
   }

   private void encryptBG_DoWork(object sender, DoWorkEventArgs e)
   {
        if (Rijndael.Checked == true)
        {
            ed.EncryptFile(textBox1.Text, textBox2.Text, "1");
        }
        else if (TripleDES.Checked == true)
        {
            ed.EncryptFile(textBox1.Text, textBox2.Text, "2");
        }
        FileInfo fInfo1 = new FileInfo(textBox1.Text);
        FileInfo fInfo2 = new FileInfo(textBox2.Text);
        double totSize = fInfo1.Length;
        double curSize = fInfo2.Length;
        while (curSize <= totSize)
        {
            Thread.Sleep(100);
            double percentage = curSize / totSize * 100;
            encryptBG.ReportProgress((int)percentage);
        }
   }

   private void encryptBG_ProgressChanged(object sender, ProgressChangedEventArgs e)
   {
        progressBar.Value = e.ProgressPercentage;
   }

   private void encryptBG_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   {
        btnEncrypt.Enabled = true;
        btnDecrypt.Enabled = true;
        MessageBox.Show("Done");
   }
}

我的加密方法不在这里,因为我引用了我制作的另一个项目中的方法。

【问题讨论】:

    标签: c# encryption progress-bar backgroundworker


    【解决方案1】:

    问题出在这里:

    while (curSize <= totSize)
    {
        Thread.Sleep(100);
        double percentage = curSize / totSize * 100;
        encryptBG.ReportProgress((int)percentage);
    }
    

    curSizetotSizewhile 循环内的值不会发生任何变化,因此您有一个无限循环。 percentage 的值在每次迭代中都是相同的,因此您的 ProgressBar 永远不会改变值并且会出现“卡住”。

    您需要弄清楚该循环内应该发生什么并修改curSize 的值,以便百分比发生变化,ProgressBar 移动,循环最终结束。

    【讨论】:

      【解决方案2】:

      也许我遗漏了一些东西,但我没有看到您将 encryptBG_ProgressChanged 方法绑定到 encryptBG 事件的位置。通常,事件绑定在您的代码中类似于“.OnProgressChanged += encryptBG_ProgressChanged...”

      您的那部分代码在此处不可见,因此可以查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-27
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        相关资源
        最近更新 更多