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

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

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

Здравствуйте. У меня в программе есть SQL скрипт ,который выполняется весьма продолжительное время. Чтобы не было ощущения, что программа зависла я решил прикрутить ПрогрессБар. Сам же скрипт создаёт в папке файлы, число которых всегда равно количеству БД. Поэтому максимальное значение ПрогрессБара равно количеству БД, а его Валуе увеличивается каждый раз как в папке появляется новый файл. В потоке я организовал по сути бесконечный цикл, который всё время проверяет количество файлов в папке. Но почему-то этот цикл срабатывает только два раза, при первом запуске и после завершения скрипта. Почему так? Собственно, сам код:
Листинг программы
  1. //Максимум прогресс бара равен количеству баз данных.
  2. progressBar1.Maximum = names.Count;
  3. //запуск потока в котором будет проверяться количество файлов в папке
  4. BWCountFile.RunWorkerAsync(new object[] { path });
  5. SqlCommand sqlCmd = new SqlCommand();
  6. sqlCmd.Connection = Globals.SQLConnection;
  7. sqlCmd.CommandText = /*Тут большой и страшный скрипт, который выполняется весьма продолжительное время*/
  8. sqlCmd.Prepare();
  9. sqlCmd.ExecuteNonQuery();
  10. BWCountFile.CancelAsync();
  11. MessageBox.Show("Завершено");
  12. }
  13. private void BWCountFile_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
  14. {
  15. Debug.WriteLine("Поток запущен");
  16. object[] ar = e.Argument as object[];
  17. string pathToCatalog = (string)ar[0];
  18. int progressbarvalue = 0;
  19. int fileCount = 0;
  20. int fileCountOld = 0;
  21. while (true)
  22. {
  23. Debug.WriteLine("Выполняется цикл"); //Вот эта надпись возникает всего два раза.
  24. if (BWCountFile.CancellationPending == true)
  25. return;
  26. fileCount = new DirectoryInfo(pathToCatalog).GetFiles().Length;
  27. if (fileCount > fileCountOld)
  28. {
  29. progressbarvalue++;
  30. fileCountOld++;
  31. }
  32. Action<int> action = ProgressBarvalue;
  33. if (InvokeRequired)
  34. {
  35. Invoke(action, progressbarvalue);
  36. }
  37. else
  38. {
  39. action(progressbarvalue);
  40. }
  41. }
  42. }
  43. private void ProgressBarvalue(int progressbarvalue)
  44. {
  45. progressBar1.Value = progressbarvalue;
  46. }
P.S. Вообще у меня есть чувство, что пишу я полную &^%$#. Если это так, то наставьте на путь истинный

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут