В приложении Visual C#/.Net мне нужно прочитать SerialPort, и поэтому я назначил ему DataReceivedEventHandler.Альтернатива использованию Control.Invoke
Однако я не могу, конечно, напрямую изменять элементы управления пользовательского интерфейса от обработчика, потому что они живут на отдельной ветке.
Решение похоже на использование Control.Invoke, однако у меня слишком много действий пользовательского интерфейса, поэтому я обеспокоен тем, что, возможно, я не принимаю правильный путь.
Какое из следующего следует делать?
Вариант А: Палка с Invoke в любом случае, и выполнять каждое из действий по каждому из различных элементов управления с использованием Invoke для каждого из них.
Вариант B: Положите 50ms повторяющегося таймера, где каждый 50мс, я проверяю, если булево DataReceived == истинного, и если да, обновить пользовательский интерфейс управление соответствующим образом. (с DataReceived установлено значение true каждый раз, когда я читаю данные в Serial Port DataReceivedEventHandler, а в противном случае - false.)
Опция C: Любая другая опция?
UPDATE:
Успех со следующим (на основе Ответ @ tcarvin и комментарии @Hans Passant в).
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired())
{
this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(DataReceivedHandler), new object[] { sender, e });
return;
}
tbSerialStatus.Text = "Received text";
}
Просто приложите усилия для буферизации данных, которые вы получаете. Не так много смысла призывать очень часто, вам нужно только держать человеческие глаза счастливыми. В любом случае делать это часто проблематично, это может вызвать проблему firehose, когда поток пользовательского интерфейса получает слишком много запросов на вызов и останавливает рисование. –