Я создаю 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» доступен из потока, отличного от потока, в котором он был создан.