我有一个应用程序,可以收集视频列表中的数据。我希望实时更新进度和文件名。我是否必须将检查这些文件的所有代码放在bw_DoWork方法中?
目前我有这种方法,但是bw.ReportProgress无法正常工作。
private void GetMovieData(List<FileInfo> completeMovieList)
{
List<string> movieLists = new List<string>();
int counter = 0;
foreach (FileInfo movie in completeMovieList)
{
counter++;
string[] movieData = new string[3];
bw.ReportProgress(counter / completeMovieList.Count);
// get last modified date
string movieLastModified = string.Concat(movie.LastWriteTime.Year + "/" + movie.LastWriteTime.Month + "/" + movie.LastWriteTime.Day);
// get duation of video
string lengthOfVideo = Program.GetDetails(movie);
if (!movieListWithData.ContainsKey(movie.Name))
{
movieData[0] = lengthOfVideo;
movieData[1] = movieLastModified;
movieData[2] = movie.FullName;
movieListWithData.Add(movie.Name, movieData);
}
movieLists.Add(movie.FullName + "|" + lengthOfVideo + "|" + movieLastModified);
}
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string[]> key in movieListWithData)
{
sb.AppendLine(key.Key + "|" + key.Value[0] + "|" + key.Value[1] + "|" + key.Value[2]);
}
File.WriteAllText(Program.movieTxtFileLocalPath, sb.ToString());
}
我的DoWork方法如下:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
if ((worker.CancellationPending == true))
{
e.Cancel = true;
}
}
答案 0 :(得分:1)
我是否必须将检查这些文件的所有代码放在bw_DoWork方法中?
不,代码不必实际存在,但您必须调用来自DoWork的代码。目前你的DoWork方法没有做任何事情。
另请记住在true
上将属性WorkerReportsProgress
设置为BackgroundWorker
。您可以在设计师中执行此操作。
答案 1 :(得分:1)
bw.ReportProgress(counter / completeMovieList.Count);
这是一个整数除法,1/2 = 0,而不是0.5。由于计数器永远不会大于Count,因此表达式总是产生0.一个可能的解决方法是计算百分比:
bw.ReportProgress(100 * counter / completeMovieList.Count);