【问题标题】:Regularly report progress of a BackgroundWorker定期报告 BackgroundWorker 的进度
【发布时间】:2011-12-24 18:22:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# multithreading backgroundworker


    【解决方案1】:

    查看这个 SO 线程。我为另一个使用 cmets 的用户回答了这个问题。 Update progress bar in MainWindow from a different Thread

    基本上,您在后台工作人员中缺少 WorkerReportsProgress = true 以及处理 ProgressChanged 事件。另外,在设置所有事件之后放置 RunWorkerAsync

    如果您希望定期更新,您应该改用 DispatcherTimer,并将您的方法放在 Tick 事件中。

    【讨论】:

      【解决方案2】:

      Backgroundworker 可帮助您保持 UI 响应迅速且易于使用。它还为你处理多线程的东西。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多