Недопустимые межпоточные операции из BackgroundWorker2_RunWorkerCompleted в C#C#

Место общения программистов C#
Ответить
Anonymous
 Недопустимые межпоточные операции из BackgroundWorker2_RunWorkerCompleted в C#

Сообщение Anonymous »

Я получаю сообщение об ошибке, которая не имеет смысла.

Код: Выделить всё

Cross-thread operation not valid: Control 'buttonOpenFile' accessed from a thread other than the thread it was created on.
В моем приложении поток пользовательского интерфейса запускает фоновый Worker1, который, когда он почти завершен, запускает фоновый Worker2 и ждет его полный. BackgroundWorker1 ожидает завершения работы BackgroundWorker2, прежде чем оно завершится. Переменные AutoResetEvent используются для обозначения завершения выполнения каждого из рабочих процессов. В фоновом Worker2_RunWorkerComplete вызывается функция, которая сбрасывает элементы управления формы. Именно в этой функции ResetFormControls() выдается исключение. Я подумал, что можно безопасно изменять элементы управления формой в функции RunWorkerCompleted. Оба фоновых работника создаются из потока пользовательского интерфейса. Вот очень обобщенная версия того, что я делаю:

Код: Выделить всё

  AutoResetEvent evtProgrammingComplete_c = new AutoResetEvent(false);
AutoResetEvent evtResetComplete_c = new AutoResetEvent(false);

private void ResetFormControls()
{
toolStripProgressBar1.Enabled = false;
toolStripProgressBar1.RightToLeftLayout = false;
toolStripProgressBar1.Value = 0;

buttonInit.Enabled = true;
buttonOpenFile.Enabled = true; // Error occurs here.
buttonProgram.Enabled = true;
buttonAbort.Enabled = false;
buttonReset.Enabled = true;
checkBoxPeripheryModule.Enabled = true;
checkBoxVerbose.Enabled = true;
comboBoxComPort.Enabled = true;
groupBoxToolSettings.Enabled = true;
groupBoxNodeSettings.Enabled = true;
}

private void buttonProgram_Click(object sender, EventArgs e)
{
while (backgroundWorkerProgram.IsBusy)
backgroundWorkerProgram.CancelAsync();

backgroundWorkerProgram.RunWorkerAsync();
}

private void backgroundWorkerProgram_DoWork(object sender, DoWorkEventArgs e)
{
// Does a bunch of stuff...

if (tProgramStat_c == eProgramStat_t.DONE)
{
tProgramStat_c = eProgramStat_t.RESETTING;

while (backgroundWorkerReset.IsBusy)
backgroundWorkerReset.CancelAsync();

backgroundWorkerReset.RunWorkerAsync();
evtResetComplete_c.WaitOne(LONG_ACK_WAIT * 2);

if (tResetStat_c == eResetStat_t.COMPLETED)
tProgramStat_c = eProgramStat_t.DONE;
}
}

private void backgroundWorkerProgram_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Updates form to report complete.  No problems here.

evtProgrammingComplete_c.Set();
backgroundWorkerProgram.Dispose();
}

private void backgroundWorkerReset_DoWork(object sender, DoWorkEventArgs e)
{
// Does a bunch of stuff...

if (tResetStat_c == eResetStat_t.COMPLETED)
if (tProgramStat_c == eProgramStat_t.RESETTING)
evtProgrammingComplete_c.WaitOne();
}

private void backgroundWorkerReset_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
CloseAllComms();
ResetFormControls();
evtResetComplete_c.Set();
backgroundWorkerReset.Dispose();
}
Любые ваши мысли и предложения будут оценены по достоинству. Я использую Microsoft Visual C# 2008 Express Edition. Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/282 ... ted-in-c-s
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»