【问题标题】:Implementing a BackgroundWorker + ProgressBar - C#实现 BackgroundWorker + ProgressBar - C#
【发布时间】:2014-04-03 22:35:23
【问题描述】:

我想为我的应用程序中的时间密集型任务引入一个 BackgroundWorker。 BackgroundWorker 应该在执行其中一项任务时更新我的​​状态条中的进度条。

一般实现没问题,只要时间密集型任务由我的表单类中的方法处理即可。

但我有一个如下所示的类:

public class JobFile
{
    public string FullName { get; private set; }
    public string FileName { get; private set; }
    public string Extension { get; private set; }
    public string Path { get; private set; }
    public Icon Icon { get; private set; }
    public DateTime Date { get; private set; }
    public long Size { get; private set; }
    public string MD5Hash { get; private set; }

    ...

    public string getMD5Hash()
    {
        // Time intensive operation occurring
    }
}

我想在我的 JobFile 对象中使用一个方法来执行计算,但我希望这个对象与我的 UI 异步通信,并更新它的进度条。

我怎样才能做到这一点?我是否需要在 JobFile 类中使用 BackgroundWorker?

这是我在异步事件中的第一步,我对自定义事件还不是很了解,所以请多多包涵!

谢谢你:)

【问题讨论】:

    标签: c# asynchronous progress-bar md5 backgroundworker


    【解决方案1】:

    请看:How to: Use a Background Worker

    界面类

    public class UI
    {
        private JobFile JobFile { get; set; }
        public int ProgressPercentage { get; set; }
    
    
        public void getMD5Hash()
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.WorkerReportsProgress = true;
            bw.DoWork += JobFile.bw_DoWork;
            bw.ProgressChanged += bw_ProgressChanged;
            bw.RunWorkerCompleted += bw_RunWorkerCompleted;
            bw.RunWorkerAsync();
        }
    
    
        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // This would have to run on dispatcher in order to update UI
            this.ProgressPercentage = e.ProgressPercentage;
        }
    
        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // If you need to do anything opn completion
        }
    }
    

    还有工作文件

    public class JobFile
    {
        public string FullName { get; private set; }
        public string FileName { get; private set; }
        public string Extension { get; private set; }
        public string Path { get; private set; }
        public DateTime Date { get; private set; }
        public long Size { get; private set; }
        public string MD5Hash { get; private set; }
    
        public void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            StringBuilder hash = new StringBuilder();
            for (int i = 1; (i <= 10); i++)
            {
                // Perform a time consuming operation and report progress.
                // Such as computing part of the hash.
                hash.Append(i);
    
                //Report progress here
                worker.ReportProgress((i * 10)); // 
            }
    
            MD5Hash = hash.ToString();
        }
    }
    

    虽然我强烈建议为此使用任务。

    【讨论】:

    • 我已经可以实现一个 BackgroundWorker,只要我将我的 MD5 散列函数编码为我的表单中的一个方法。没问题,我已经这样做了。我可以完美地更新 ProgressBar,因为我在同一个班级中做所有事情。我在这里尝试做的是通过调用 A 类(JobFile)中的一个方法来计算哈希值,该方法应该在 B 类(UI)中引发进度和完成事件。我不确定在这种情况下如何进行。
    • 您在 UI、WInForms 或 WPF 中使用什么?
    • WinForms。哈希函数目前在 JobFile 类中,而 BackgroundWorker 在我的表单中(当然是 ProgressBar)。
    • 您可以将 bw_DoWork 方法放入 JobFile 中,并让您的 UI 类中的 BW 在工作开始时调用 JobFile.bw_DoWork。并且 JobFile 可以引发 worker.ProgressChanged(i) 事件,你可以在 UI 线程上监听;
    • 我不建议从 UI 旋转 BW,UI 应该只关心 UI 逻辑。我会研究 MVVM。
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多