C#Progressbar&文本框未更新

时间:2014-05-29 17:09:19

标签: c# wpf

我在这里看到了一些很棒的答案,并且想知道是否有人可以帮助我。

这是我的代码:

namespace expandGUIWPF
{

        public static string getSHA256b64(string filepath)
        {
            byte[] bytes = SHA256.Create().ComputeHash(File.ReadAllBytes(filepath));
            return Convert.ToBase64String(bytes);
        }

        private void btnRun_Click(object sender, RoutedEventArgs e)
        {
            {
                string folder = txtFolder.Text;
                string filelist = folder + "\\FileList.txt";
                string[] test = Directory.GetFiles(folder, "*", System.IO.SearchOption.AllDirectories);
                File.WriteAllLines(filelist, test);


                int length = File.ReadLines(filelist).Count();
                pBar1.Minimum = 1;
                pBar1.Maximum = length;

                File.WriteAllLines(filelist, test);

                using (StreamReader sr = new StreamReader(filelist))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string oldfile = line;
                        string newfile = oldfile + ".expanded";
                        string oldhash = "";
                        string newhash = "";

                        try
                        {
                            ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\test\test.exe", oldfile + " " + newfile);
                            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                            Process.Start(startInfo);

                            Thread.Sleep(1000);

                            if (File.Exists(oldfile))
                            {
                                oldhash = getSHA256b64(oldfile);
                            }
                            if (File.Exists(newfile))
                            {
                                newhash = getSHA256b64(newfile);
                                File.Delete(oldfile);
                                File.Move(newfile, oldfile);
                            }

                            pBar1.Value = pBar1.Value + 1;

                            txtLog.AppendText(oldfile + "\r\n   Old: " + oldhash + "\r\n   New: " + newhash + "\r\n");
                            if (!(oldhash == newhash))
                            {
                                txtLog.AppendText("Successfully expanded file \r\n");
                            }
                            else
                            {
                                txtLog.AppendText("Unable to expand file \r\n");
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                }
            }
        }
    }
}

问题是我的进度条没有更新。我知道一点C#但我是WPF的初学者,并且无法理解设置后台工作者来更新我的UI。有人可以给我一些指示吗?目前该应用程序工作正常,但进度条跳转到100%完成,所有文本突然出现。

提前致谢!

汤姆

3 个答案:

答案 0 :(得分:1)

首先,您希望后台工作人员处理 DoWork 事件中的进程。在该事件中,您可以调用 ProgressChanged 事件来更新进度条。以下是一个例子:

    private void btnRun_Click(object sender, RoutedEventArgs e)
    {
        if(workerThread.IsBusy == false)  // Make sure someone doesn't click run multiple times by mistake
        {
            pBar1.Value = 0;
            workerThread.RunWorkerAsync();
        }
    }

    private void workerThread_DoWork(object sender, DoWorkEventArgs e)
    {
        // Definitions and so forth
        pBar1.Minimum = 0;
        pBar1.Maximum = length;
        int status = 0;
        using (StreamReader sr = new StreamReader(filelist))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                // Try/Catch work here
                status++;
                workerThread.ReportProgress(status);
            }
    }

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

答案 1 :(得分:0)

请理解,运行表单的主题与用于更新表单控件的主题相同。所以如果你有'东西'要做 - 就像加密/解密文件中的行 - 你需要在另一个带回调的线程上执行这些项目,否则表单显示不会更新,直到完成你的事情为止。您可以从工作线程内部引发事件 - 并使用主(表单)线程上的事件处理程序捕获它们以更新进度条。

答案 2 :(得分:0)

似乎您的UI线程被阻止,在Windows窗体编程中您有一个消息泵,而当您的主线程(UI)正在做其他事情时,它必须等待它才能处理消息。您可以通过设置后台工作程序来发送更新来解决此问题

有关UI线程和消息泵的更多信息,请参阅

http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

有关backgroundworker线程的信息,请参阅此

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

小示例代码

// This event handler is where the time-consuming work is done. 
     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
     {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 10; i++)
        {
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                // Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i * 10);
            }
        }
    }
相关问题