Нужно ли делать ReportProgress в фоновом методе DoWork в c #? - PullRequest
2 голосов
/ 12 декабря 2010

У меня есть приложение, которое собирает данные в списке видео.Я хочу, чтобы прогресс и имена файлов обновлялись в реальном времени.Нужно ли размещать весь код, который проверяет эти файлы, в методе 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());
    }

MyМетод DoWork выглядит так:

private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;

            }

}

Ответы [ 2 ]

1 голос
/ 12 декабря 2010
        bw.ReportProgress(counter / completeMovieList.Count);

Это целочисленное деление, 1/2 = 0, а не 0,5. Поскольку счетчик никогда не будет больше, чем Count, выражение всегда выдает 0. Одним из возможных исправлений является вычисление процента:

        bw.ReportProgress(100 * counter / completeMovieList.Count);
1 голос
/ 12 декабря 2010

Нужно ли размещать весь код, который проверяет эти файлы, в методе bw_DoWork?

Нет, код не обязательно должен быть физически, но вы должны позвоните код от DoWork.В настоящее время ваш метод DoWork ничего не делает.

Также не забудьте установить свойство WorkerReportsProgress на true на BackgroundWorker.Вы можете сделать это в конструкторе.

...