Событие мешает подпрограммам - PullRequest
0 голосов
/ 14 декабря 2009

Я борюсь с событием, связанным с моим классом связи.

Я вызываю функцию DataChange через обработчик событий каждый раз, когда получаю новые данные через последовательное соединение. Затем я продолжаю загружать эти данные в DataGridView, выполнять некоторое форматирование и т. Д. Для пользователей. Я получаю массу проблем из-за частоты, с которой вызывается событие DataChange, и кажется, что оно отвлекает внимание от других подпрограмм и функций среднего уровня.

Например, я попытаюсь передать данные обратно на последовательное устройство. После того, как я отформатирую данные, но прежде чем я смогу вызвать функцию Send из моей библиотеки, фокус направляется обратно в DataChange, и я никогда не передаю свои данные.

Является ли эта проблема наилучшим образом решенной путем потоковой обработки подпрограмм, связанных с DataChange, отсоединения события DataChange перед функцией или подпрограммой, а затем с повторной фиксацией, или есть какой-то основной принцип, который я не реализую.

Ответы [ 2 ]

1 голос
/ 14 декабря 2009

Похоже, что это может быть проблемой синхронизации потоков.

События по сути являются многопоточными, поэтому их решение путем добавления потоков не является проблемой.

Попробуйте использовать SyncLock для обеспечения синхронизации потоков.

Всякий раз, когда вы получаете данные, блокируйте объект до тех пор, пока вы не закончите использовать данные.

SyncLock lockObject
    'Handle data changed...
End SyncLock

Я считаю, что термин для этой ситуации является условием расы.

0 голосов
/ 14 декабря 2009

Ваши данные попадают в буфер в одном потоке и просматривают буфер из другого потока. В первичном потоке пометьте буфер как «готовый к отправке» и попросите вторичный поток следить за этим. Просто убедитесь, что SyncLock объекта. В зависимости от того, что представляют собой ваши данные, вы можете создать объект, который может обернуть его, и просто использовать логический флаг, а затем выбросить его в список (Of T). Дайте вашему монитору спать в течение 50 или более миллисекунд, заблокируйте буфер и проверьте флаги, вытащите то, что нужно, разблокируйте список и вытолкните данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...