2011-12-24 41 views
1

我在写音乐播放器。这是向播放列表添加目录的(早期)代码:定期报告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(); 
     } 
    } 

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

回答

0

看看这个线程。我回答了另一位有意见的用户。 Update progress bar in MainWindow from a different Thread

从本质上讲,你缺少WorkerReportsProgress =真在后台工作,以及处理ProgressChanged事件。另外,在设置所有事件后,请输入RunWorkerAsync

如果您正在寻找定期更新,则应该使用DispatcherTimer代替,并将您的方法置于Tick事件中。

0

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

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

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