Синхронизировать BackgroundWorkerC#

Место общения программистов C#
Ответить
Anonymous
 Синхронизировать BackgroundWorker

Сообщение Anonymous »

Я использую BackgroundWorker для обновления элементов управления в форме каждые 30 секунд. BackgroundWorker открывает COM-порт и считывает данные с последовательного прибора. Он утверждает ReportProgress() для обновления элементов управления в форме. Моя форма также содержит тумблер, который открывает тот же COM-порт, что и BackgroundWorker, для изменения состояния инструмента. Мне нужно остановить запуск BackgroundWorker при возникновении события StateChanged переключателя Toggle Switch, чтобы избежать состояния гонки и ограничить доступ к COM-порту одним потоком.
Вот выдержки из моего кода:

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

       private void BackgroundWorkerStatus_DoWork(object sender, DoWorkEventArgs e)
{
try
{
while (!BackgroundWorkerStatus.CancellationPending)
{
// Get new values (Open COM Port, read state)
ReadState();

// Update the User Interface
BackgroundWorkerStatus.ReportProgress(0);

// Wait before updating again
Thread.Sleep(UpdateInterval);
}
}
catch
{
MessageBox.Show(….)
}
}

private void BackgroundWorkerStatus_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
// Update controls on the Form
}
catch
{
MessageBox.Show(….);
}

private void ToggleSwitch_StateChanged(object sender, NationalInstruments.UI.ActionEventArgs e)
{
// Open COM Port, set state, update Form
}

Я пробовал вызвать CancelAsync() в начале события StateChanged и вызвать RunWorkerAsync() в конце.
Я пытался создать глобальный Логическое значение, заданное в событии StateChanged и оцениваемое в методе DoWork.
Предположительно, ни один из них не работает, поскольку CancelPending и глобальное логическое значение не оцениваются непрерывно, и их состояние изменяется во время потока BackgroundWorker. находится в процессе работы.
Я также пробовал использовать семафор, но это вызывает исключение перекрестной обработки, когда фоновый поток пытается обновить пользовательский интерфейс. Я понимаю, почему, но не знаю, как это обойти.
По сути, мне нужна комбинация Semaphore и BackgroundWorker для синхронизации фоновой задачи, которая также может обновлять пользовательский интерфейс.
Как это лучше всего сделать?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/788 ... oundworker
Ответить

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

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

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

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

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