Важная информация
Показано с 1 по 2 из 2

Тема: Не работает BackgroundWorker и Invoke

  1. #1 Не работает BackgroundWorker и Invoke 
    Новичок
    Регистрация
    31.10.2018
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Не могу понять почему, во первых не могу прервать фоновый поток, и второе почему не отображается процесс загрузки в прогресс баре?
    Запуск потока в private void dirsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
    C# Code:
    1.  
    2. protected void PopulateFiles()
    3.         {
    4.             string[] lvData = [Ссылки могут видеть только зарегистрированные пользователи. ] string[4];
    5.             InitListView();
    6.             if (nodeCurrent.SelectedImageIndex != 0)
    7.             {
    8.                 if (Directory.Exists(nodeCurrent.FullPath) == false)
    9.                 {
    10.                     MessageBox.Show("Каталог или путь к каталогу " + dirsTreeView.SelectedNode.FullPath + " не найден.");
    11.                 }
    12.                 else
    13.                 {
    14.                     try
    15.                     {
    16.                         string stringFileName;
    17.                         string[] maskFiles = { "", "" };
    18.                         DateTime dtModifyDate;
    19.                         string strMessage = "Parsing directory " + dirsTreeView.SelectedNode.FullPath;
    20.                         backgroundWorker1.ReportProgress(0, strMessage);
    21.                         foreach (string stringFiles in Directory.GetFiles(nodeCurrent.FullPath, "*.*", System.IO.SearchOption.AllDirectories)
    22.                         .Where(s => s.EndsWith(".docx") || s.EndsWith(".doc") || s.EndsWith(".html") || s.EndsWith(".htm") || s.EndsWith(".pdf")
    23.                                   || s.EndsWith(".ppt") || s.EndsWith(".pptx")|| s.EndsWith(".xlsx") || s.EndsWith(".xls") || s.EndsWith(".mp4")
    24.                                   || s.EndsWith(".avi") || s.EndsWith(".wmv")))
    25.                         {
    26.                             stringFileName = stringFiles;
    27.                             FileInfo objFileSize = [Ссылки могут видеть только зарегистрированные пользователи. ] FileInfo(stringFileName);
    28.                             dtModifyDate = objFileSize.LastWriteTime;
    29.  
    30.                             lvData[0] = GetPathName(stringFileName);
    31.                             lvData[1] = formatDate(dtModifyDate);
    32.                             lvData[2] = stringFileName;
    33.  
    34.                             ListViewItem lvItem = [Ссылки могут видеть только зарегистрированные пользователи. ] ListViewItem(lvData);
    35.                             lvFiles.Items.Add(lvItem);
    36.                             Application.DoEvents();
    37.                         }
    38.                     }
    39.                     //catch (DirectoryReadOnlyException) { MessageBox.Show("Ошибка: Диск не готов или каталог не существует."); }
    40.                     catch (UnauthorizedAccessException) { MessageBox.Show("Ошибка: Доступ к диску или каталогу запрещен."); }
    41.                     catch (Exception e) { MessageBox.Show("Ошибка: " + e); }
    42.                 }
    43.  
    44.             }
    45.             
    46.         }
    47.  
    48.         private void dirsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
    49.         {
    50.                 Cursor = Cursors.WaitCursor;
    51.                 nodeCurrent = e.Node;
    52.                 if (Directory.Exists((dirsTreeView.SelectedNode.FullPath)) == false)
    53.                 {
    54.                     MessageBox.Show("Каталог или путь к каталогу " + dirsTreeView.SelectedNode.FullPath + " не найден.");
    55.                 }
    56.                 else
    57.                 {
    58.                     toolStripStatusLabel1.Text = "Идет загрузка файлов...";
    59.                     toolStripStatusLabel1.ForeColor = System.Drawing.Color.Red;
    60.                     lvFiles.Visible = false;
    61.                     
    62.                     if (backgroundWorker1.IsBusy != true)
    63.                         {
    64.                          backgroundWorker1.RunWorkerAsync();
    65.                      }
    66.                     lvFiles.ListViewItemSorter = [Ссылки могут видеть только зарегистрированные пользователи. ] ListViewComparer(1, SortOrder.Descending);
    67.                     lvFiles.Sort();
    68.             }    
    69.         }
    70.  
    71.         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    72.         {
    73.             Invoke([Ссылки могут видеть только зарегистрированные пользователи. ] Action(() =>
    74.             {
    75.                 PopulateFiles();
    76.             }));
    77.         }
    78.  
    79.         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    80.         {
    81.             if (e.Error != null)
    82.             {
    83.                 statusLabel.Text = e.Error.Message;
    84.             }
    85.             else if (e.Cancelled)
    86.             {
    87.                 statusLabel.Text = "Процесс завершен";
    88.             }
    89.             else
    90.             {
    91.                 toolStripStatusLabel1.ForeColor = System.Drawing.Color.Black;
    92.                 toolStripStatusLabel1.Text = "Найдено файлов: " + lvFiles.Items.Count;
    93.                 Cursor = Cursors.Default;
    94.                 lvFiles.Visible = true;
    95.             }
    96.         }
    97.  
    98.         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    99.         {
    100.             toolStripProgressBar1.Value = e.ProgressPercentage;
    101.         }
    102.  
    103.         private void остановитьЗагрузкуToolStripMenuItem_Click(object sender, EventArgs e)
    104.         {
    105.             if (backgroundWorker1.WorkerSupportsCancellation)
    106.             {
    107.                 backgroundWorker1.CancelAsync();
    108.             }
    109.         }
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,648
    Сказал(а) спасибо
    1,701
    Поблагодарили 864 раз(а) в 738 сообщениях
    Записей в блоге
    1
    Цитата Сообщение от Ринат Шакиров Посмотреть сообщение
    Не могу понять почему, во первых не могу прервать фоновый поток
    Любой поток работает до того момента, пока не происходит выход из процедуры потока.
    Вы уверены, что знаете, что конкретно делает метод CancelAsync?

    У меня вот другая инфа, более классического характера:
    https://habr.com/post/126495/

    Про пришибание потока, сталкивался, но в деталях не помню, помню что удалось побороть только через WinAPI,
    поэтому гуглите в ту сторону, про кроссплатформу тогда можете забыть.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    Ограниченно модерирую.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Как это работает.
    от Сергей Гапонов в разделе Общие вопросы программирования
    Ответов: 2
    Последнее сообщение: 03.04.2018, 22:01
  2. Не работает кнопка
    от rrrFer в разделе Ошибки и проблемы
    Ответов: 2
    Последнее сообщение: 19.02.2018, 14:21
  3. не работает ЧАТ
    от Сёма в разделе PHP
    Ответов: 3
    Последнее сообщение: 11.10.2016, 11:34
  4. не работает код
    от Діма Стасюк в разделе PHP
    Ответов: 3
    Последнее сообщение: 04.03.2016, 16:04
  5. Не работает тег SQL
    от The trick в разделе Архив
    Ответов: 6
    Последнее сообщение: 24.12.2014, 18:45
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •