Вот выдержки из моего кода:
Код: Выделить всё
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
}
Я пытался создать глобальный Логическое значение, заданное в событии StateChanged и оцениваемое в методе DoWork.
Предположительно, ни один из них не работает, поскольку CancelPending и глобальное логическое значение не оцениваются непрерывно, и их состояние изменяется во время потока BackgroundWorker. находится в процессе работы.
Я также пробовал использовать семафор, но это вызывает исключение перекрестной обработки, когда фоновый поток пытается обновить пользовательский интерфейс. Я понимаю, почему, но не знаю, как это обойти.
По сути, мне нужна комбинация Semaphore и BackgroundWorker для синхронизации фоновой задачи, которая также может обновлять пользовательский интерфейс.
Как это лучше всего сделать?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/788 ... oundworker