Передача фонового работника другому классу в VSTO Excel Add In - PullRequest
0 голосов
/ 09 мая 2018

Я создаю VSTO Excel Add In для Excel 2010 ... У меня есть форма, в которой пользователь выбирает запрос, а затем заполняет лист соответствующим образом из таблицы.

Я хочу сообщить о ходе выполнения операции. Операция существует в отдельном классе, чем пользовательский интерфейс. Таким образом, я создаю класс (ol и ole) и вызываю метод в обработчике DoWork.

private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker)sender;

        if (!_isExtended)
        {
            oneline ol = new oneline();
            ol.buildOneline(this._wheres,worker );
        }
        else
        {
            ExtendedOneline ole = new ExtendedOneline();
            ole.buildExtendedOneline(this._wheres,worker);
        }
        //worker.ReportProgress();
        e.Result = "COMPLETE!";
    }

    private void backgroundWorker3_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.progressBar1.Value = e.ProgressPercentage;

    }

    private void backgroundWorker3_WorkerCOmpleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show(e.Result.ToString());
        this.Close();
    }

Тогда внутри класса, в частности, метод, который я использую, имеет аргумент, установленный для BackgroundWorker bw. Вот так я передаю работнику. Затем, когда это уместно, я намереваюсь обновить прогресс, позвонив по номеру bw.ReportProgress(PercentComplete)

public void buildOneline(List<WhereStatement> wheres, BackgroundWorker bw)
{
    ....
    ....
    double count = joinedWells.Count;
    double i = 1;
    foreach (var well in joinedWells)
    {
        double PercentComplete = 100 * (i / count);
        bw.ReportProgress((int)PercentComplete);
        ....
        ....
        i++;
    }

Этот скрипт успешно выполняется, однако индикатор выполнения вообще не изменяется ... Мысли?

РЕДАКТИРОВАТЬ

    // backgroundWorker3
    this.backgroundWorker3.WorkerReportsProgress = true;
    this.backgroundWorker3.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker3_ProgressChanged);
    this.backgroundWorker3.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker3_DoWork);

РЕДАКТИРОВАТЬ 2

//progressBar1
this.progressBar1.Location = new System.Drawing.Point(10, 340);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(583, 20);
this.progressBar1.Step = 1;
this.progressBar1.TabIndex = 15;
this.progressBar1.Maximum = 100;
this.progressBar1.Minimum = 0;

ERROR Теперь я вижу эту ошибку, которую я не видел раньше.

`Необработанное исключение типа 'System.InvalidOperationException' произошло в System.Windows.Forms.dll

Дополнительная информация: операция с несколькими потоками недопустима: элемент управления «progressBar1» доступен из потока, отличного от потока, в котором он был создан.

1 Ответ

0 голосов
/ 09 мая 2018

VSTO имеет проблемы с компонентом BackgroundWorker. Вам нужно установить контекст синхронизации, чтобы заставить его работать.

System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());

bw = new BackgroundWorker();
...
bw.RunWorkerAsync();
...