ReportProgress是否必须在c#中的DoWork Ba​​ckground方法中完成?

时间:2010-12-12 02:47:19

标签: c# backgroundworker

我有一个应用程序,可以收集视频列表中的数据。我希望实时更新进度和文件名。我是否必须将检查这些文件的所有代码放在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;

            }

}

2 个答案:

答案 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);