Синхронизировать 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Этот BackgroundWorker в настоящее время занят и не может одновременно выполнять несколько задач.
    Anonymous » » в форуме C#
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Использование/добавление метода делегирования и BackgroundWorker в мою полностью рабочую программу
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • BackgroundWorker, использующий асинхронные методы HttpClient.
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • BackgroundWorker.RunworkerAsync не достигает метода DoWork
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Параллельные потоки в C# с использованием BackgroundWorker
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

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