обновление datagridview с фоновым рабочим c#, анализ "RunWorkerCompleted" для каждой строки - PullRequest
0 голосов
/ 01 августа 2020

В настоящее время я новичок в использовании фонового рабочего и реализовал простой скрипт обновления для своего процесса. Фоновый рабочий запускает мой процесс - python скрипт, веб-драйвер, который запускает Google, затем "driver.quits ()" (где процесс считается завершенным).

Фоновый рабочий подключен к кнопке, он извлекает каталог полного пути для моего python скрипта из моего столбца datagridview "PD" и использует путь для запуска процесса под моим фоновым рабочим. В моем datagridview есть несколько строк с несколькими путями для дублирования сценариев python. Для одновременного запуска всех этих python файлов (строк) я использую (пример 1): (который проходит через все мои строки, извлекает значение ячейки python полного пути к файлу для строки и использует путь для запуска в процессе в фоновом режиме). Здесь я могу очень легко запускать все мои файлы (строки) одним нажатием кнопки ... Однако, поскольку я вручную выбираю каждую из моих строк в моем скрипте, фоновый рабочий запускает каждую конкретную c python файл / путь (строка), хотя не может обновить значение каждой ячейки строки «StatusR» по завершении. Фоновый рабочий обновляет столбец «StatusR», который представляет собой простой столбец текстового поля ... Когда каждый процесс завершается, я sh для фонового рабочего, чтобы выбрать строку, к которой принадлежит указанный c процесс, и обновить текст метки на «Завершено». В настоящий момент фоновый исполнитель проходит через все мои строки, обновляет текст в каждой строке в столбце «StatusR» до «выполняется» из «ожидания» (по умолчанию) и обновляет одну строку значение ячейки с "complete" (последняя выбранная строка сценарием, совпадение путем вызова "для каждой строки"), когда все драйверы завершены sh запущены. Был бы признателен за помощь :)

НА КНОПКЕ (python скрипт запускается на строку): https://gyazo.com/05e7252a09ef508bc7ebaed753c63469

РЕЗУЛЬТАТ (после выхода скрипта): https://gyazo.com/a3ba0b7872074d83462797dabdf9cab2

Вручную выбрать все строки (позволяет мне просто запускать каждую строку, значение пути как процесс сразу в моем datagridview): ПРИМЕР 1

foreach (DataGridViewRow row in dataGridView1.Rows)
      {
         if (row.Cells[3].Value.ToString().Equals("3")) #this value is set to 3 for all of my columns  to easily select them all --constant :)
          {
                 dataGridView1.ClearSelection();
                 row.Selected = true;

                 #script to read python path and execute background worker with respective path (datagridview column value)

Фоновый рабочий:

   ...............
  
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = false;
        worker.WorkerSupportsCancellation = false;
        dataGridView1.SelectedRows[0].Cells[8].Value = "Running";
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.RunWorkerAsync();
    }
    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        var p = new System.Diagnostics.Process();
        p.StartInfo.FileName = "C://Users//Win_10//AppData//Local//Programs//Python//Python38-32//python.exe";
        p.StartInfo.Arguments = "C://Users//Win_10//AppData//Local//Programs//Python//Python38-32//harrypotterbackground.py";
        p.Start();
        p.WaitForExit();
    }

    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        dataGridView1.ClearSelection();
        int inde = dataGridView1.CurrentRow.Index;
        dataGridView1.Rows[inde].Selected = true;
        dataGridView1.CurrentRow.Cells[8].Value = "idle";
    }
}

1 Ответ

0 голосов
/ 01 августа 2020

C# должен ли я создавать один фоновый рабочий процесс или несколько?

public void SomeEventHandlerMaybe(object sender, EventArgs e) {
  // do something

  var bw = new BackgroundWorker();
  bw.ReportsProgress = true;
  bw.DoWork += delegate {
    // do work. You can use locals from here MY FIXMY FIXMY FIX
  };
  bw.ProgressChanged += delegate { ... };
  bw.RunWorkerCompleted += delegate {
    // do something with the results.
  };
  bw.RunWorkerAsync();
}
...