定期报告BackgroundWorker的进度

时间:2011-12-24 18:22:47

标签: c# multithreading backgroundworker

我正在写一个音乐播放器。这是将早期代码添加到播放列表的代码:

    private void SelectFolderButton_Click(object sender, EventArgs e)
    {
        int count = 0;
        AddFolderDialog.ShowDialog();
        if(AddFolderDialog.SelectedPath != string.Empty)
        {
            BackgroundWorker bgw = new BackgroundWorker();
            bgw.DoWork += (a,b) => playlist.AddFolder(AddFolderDialog.SelectedPath, RecursiveCheckBox.Checked, out count);
            bgw.RunWorkerAsync();
            bgw.RunWorkerCompleted += (a, b) => mainStatusLabel.Text = "Added " + count + " songs"; ;
            bgw.RunWorkerCompleted += (a, b) => DrawPlaylist();
        }
    }

我刚开始使用线程。第一个问题是,这是一个正确的代码吗?这里有什么明显的错误吗?第二个问题是我想定期显示添加的歌曲数量。不一定是一首歌;一秒钟就好了。我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

查看此SO主题。我回答了另一个有评论的用户。 Update progress bar in MainWindow from a different Thread

基本上,您在后台工作程序中缺少 WorkerReportsProgress = true ,以及处理 ProgressChanged 事件。此外,在设置完所有活动后,请输入 RunWorkerAsync

如果您要定期更新,则应使用DispatcherTimer,并将方法放在 Tick 事件中。

答案 1 :(得分:0)

Backgroundworker可帮助您保持UI响应并易于使用。它也关心多线程的东西。

Backgroundworker也有一个ProgressChanged事件。工作线程可以使用ReportProgress(int percentProgress)方法报告进度。如果你不知道百分比这不是问题;只传递作为参数处理的歌曲数量。它是您的ProgressChanged事件处理程序,它接收此编号。让它做任何适合这个数字的事情。在处理了一定数量的歌曲或经过一段时间后,提升ProgressChanged事件。只需记住上次进度变化的开始时间或时间,并查看自那时起已经过了多长时间。不需要任何计时器等。

另请注意,多线程的一个基本问题是,只允许UI线程(运行主应用程序代码的线程)与表单和控件进行交互。 Backgroundworker会自动为UI线程调用RunWorkerCompleted和ProgressChanged事件处理程序。