none
проблема с BackgroundWorker RRS feed

  • Вопрос

  • Доброе время суток.

    Проблема вот в чём. Делаю проект в котором создал BackgroundWorker который делает  преброзования в таблицах. BackgroundWorker кинул на форму и в коде события такие

    private void backgroundWorker_FonaStradnieks_DoWork(object sender, DoWorkEventArgs e)
            {
                
              
             
                foreach (DataRow TabulasIeraksts in Tabula.Rows)
                {
                   
    //действия с таблицой         
                   
                    backgroundWorker_FonaStradnieks.ReportProgress(% от сделанного);
                   
                                       
                    if (backgroundWorker_FonaStradnieks.CancellationPending)
                    {
    
                        e.Cancel = true;
    
                        return;
    
                    }
                    
    
    
                }
               
               
            }
    
            private void backgroundWorker_FonaStradnieks_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
               
                  // действия после обработки, вывод отчёта                   
            }
    
            private void backgroundWorker_FonaStradnieks_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                           toolStripProgressBar_Progress.Value = e.ProgressPercentage;
            }
    Когда запускаю проект с VisualStudio всё работает но когда пробую запустить ехе файл то он зависает. В чём может быть проблема?
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:40 MSDN Forums Consolidation (От:Visual C#)
    16 марта 2010 г. 7:26

Ответы

  • попробуйте использовать паттерн при работе с контролами формы
    if(control.InvokeRequired) 
      control
    .Invoke(Action); 
    else 
     
    Action() 
    в методе DoWork, там где происходит работа с таблицей
    убедитесь что работа с котролами формы происходит потокобзопасно
    • Помечено в качестве ответа Art4iks 18 марта 2010 г. 9:03
    16 марта 2010 г. 19:23

Все ответы

  • Да в чем угодно. В каком смысле "зависает"?
    16 марта 2010 г. 8:53
  • Not responding пишет. Открываю файл и он отрисовывает примерно пол таблици. ProgressBar останавливается то в 77% то в 80% как повезёт. что-то делать с

    dataGridView невозможно. Даёт только один раз в него выбрать ячейку и зависает.

     

    16 марта 2010 г. 9:04
  • Попробуйте вызывать ReportProgress не на каждом шаге цикла, а через, скажем, каждые 50 или 100 строчек.

    16 марта 2010 г. 9:47
  • Я уберал все действия вывода прогресса и оставил просто обработку данных. Ситуация немемяется
    16 марта 2010 г. 9:50
  • А если обрабатывать данные синхронно в основном потоке, то всё нормально отрабатывает?

    16 марта 2010 г. 10:06
  • Да. Всё нормально работает и в том случае когда проект запускается с VisualStudio  но когда запускаю ехе файл из папки Release всё висит. Заметл что AcceptChanges(); для таблици datatable в событии DoWork тоже не срабатывает.
    16 марта 2010 г. 11:46
  • Возможно, сказанное ниже поможет более детально изучить проблему.

    Соберите проект в Debug режиме. Запустите exe файл. Приложение, как вы писали раньше, должно зависнусть.
    Далее откройте Visual Studio c проектом -> Debug->Attach To Process. приаттачтесь к процессу.
    остановите выполнение потоков в студии Debug-Break all.
    Потом жмите Debug-Windows-Threads.

    И в открывшемся окне Threads  откройте поток, который запустил Background worker и посмотрите, что он делает.

    Возможно, вы просто ловите dead lock. Таблица, которую Вы обрабатываете? не использует BindingSource?
    16 марта 2010 г. 11:47
  • Возможно, сказанное ниже поможет более детально изучить проблему.

    Соберите проект в Debug режиме. Запустите exe файл. Приложение, как вы писали раньше, должно зависнусть.
    Далее откройте Visual Studio c проектом -> Debug->Attach To Process. приаттачтесь к процессу.
    остановите выполнение потоков в студии Debug-Break all.
    Потом жмите Debug-Windows-Threads.

    И в открывшемся окне Threads  откройте поток, который запустил Background worker и посмотрите, что он делает.
    стоит зелёная стрелка на Application.Run(new Form_Galvena());


     if (AllProcesses.Length <= 1)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form_Galvena());
                }
                
    16 марта 2010 г. 11:54
  • Cannot evaluate expression because a native frame is on top of the call stack.

    Из-за чего он такое пишет?

    16 марта 2010 г. 12:51
  • Провел повторно всё что требовалось. Теперь он застревает на строке Datatable.AcceptChanges() почему он не может  это сделать?

    16 марта 2010 г. 13:52
  • попробуйте использовать паттерн при работе с контролами формы
    if(control.InvokeRequired) 
      control
    .Invoke(Action); 
    else 
     
    Action() 
    в методе DoWork, там где происходит работа с таблицей
    убедитесь что работа с котролами формы происходит потокобзопасно
    • Помечено в качестве ответа Art4iks 18 марта 2010 г. 9:03
    16 марта 2010 г. 19:23
  • Всё  разобрался Invoke хорошая штука когда разберёш как работает. Подскажите теперь как задержать обновление датагрида так как отдельный поток закрашивает ячейки. SuspendLayout() не помогает. Сильно всё затормаживается :( 

    Art4iks не забывайте помечать ответы и полезные сообщения
    Для связи [Mail]
    18 марта 2010 г. 8:13