Не могу разобраться с циклом внутри потока - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. У меня в программе есть SQL скрипт ,который выполняется весьма продолжительное время. Чтобы не было ощущения, что программа зависла я решил прикрутить ПрогрессБар. Сам же скрипт создаёт в папке файлы, число которых всегда равно количеству БД. Поэтому максимальное значение ПрогрессБара равно количеству БД, а его Валуе увеличивается каждый раз как в папке появляется новый файл. В потоке я организовал по сути бесконечный цикл, который всё время проверяет количество файлов в папке. Но почему-то этот цикл срабатывает только два раза, при первом запуске и после завершения скрипта. Почему так? Собственно, сам код:
 //Максимум прогресс бара равен количеству баз данных.
            progressBar1.Maximum = names.Count;
 
            //запуск потока в котором будет проверяться количество файлов в папке
            BWCountFile.RunWorkerAsync(new object[] { path });
 
            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.Connection = Globals.SQLConnection;                    
            sqlCmd.CommandText = /*Тут большой и страшный скрипт, который выполняется весьма продолжительное время*/
            sqlCmd.Prepare();
            sqlCmd.ExecuteNonQuery();
 
            BWCountFile.CancelAsync();
            MessageBox.Show("Завершено");           
        }
 
        private void BWCountFile_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            Debug.WriteLine("Поток запущен");
            object[] ar = e.Argument as object[];
            string pathToCatalog = (string)ar[0];
            int progressbarvalue = 0;
            int fileCount = 0;
            int fileCountOld = 0;           
            while (true)
            {
                Debug.WriteLine("Выполняется цикл"); //Вот эта надпись возникает всего два раза.
                if (BWCountFile.CancellationPending == true)
                    return;
 
                fileCount = new DirectoryInfo(pathToCatalog).GetFiles().Length;
                if (fileCount > fileCountOld)
                { 
                    progressbarvalue++;
                    fileCountOld++;                    
                }
 
                Action<int> action = ProgressBarvalue;
                if (InvokeRequired)
                {
                    Invoke(action, progressbarvalue);
                }
                else
                {
                    action(progressbarvalue);
                }               
            }
        }
 
        private void ProgressBarvalue(int progressbarvalue)
        {
            progressBar1.Value = progressbarvalue;
        }
P.S. Вообще у меня есть чувство, что пишу я полную &^%$#. Если это так, то наставьте на путь истинный

Решение задачи: «Не могу разобраться с циклом внутри потока»

textual
Листинг программы
BWCountFile.ReportProgress(progressbarvalue);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5