Я хочу обновить пользовательский интерфейс из обработчика событий SerialPort DataReceived.Я обнаружил проблему, потому что обработчик событий неявно выполнялся в другом потоке формы, а не просто обновлял пользовательский интерфейс ...
myLabel.Text = "Some text";
... Мне пришлось использовать следующий подход:
InvokeControlAction<Label>(myLabel, lbl=> lbl.Text= "Some text");
...
public static void InvokeControlAction<t>(t cont, Action<t> action) where t : Control
{
if (cont.InvokeRequired)
{
cont.Invoke(new Action<t, Action<t>>(InvokeControlAction),
new object[] { cont, action });
}
else
{
action(cont);
}
}
Пока все хорошо ... Однако теперь я хочу обновить ToolStripStatusLabel - использование того же подхода приводит к ошибке «неявного преобразования ссылок между ToolStripStatusLabel и Forms.Control».
Из того, что я прочитал, проблемы связаны с тем, что вы не можете вызвать ToolStripStatusLabel.
Итак, как мне лучше всего справиться с этим?
Примечание: делегаты и т. Д. Находятся на пороге моей нынешней способности, поэтому было бы полезно получить объяснение наряду с решением.
ОБНОВЛЕНИЕ 1: Просто чтобы прояснить, япопытался создать ToolStripStatusLabel, эквивалентный InvokeControlAction, но это не сработает, потому что у него нет метода invoke.
RESULT : после пересмотра моего решения я реализовал его какМетод расширения, как первоначально предложил Джимми.
Я создал статический класс ExtensionMethod (в своем собственном пространстве имен 'ExtensionMethods'), добавленный в метод InvokeOnToolStripItem, добавив 'using ExtensionMethods;'директива в моем исходном классе и вызывал методы следующим образом:
tsStatusValue.InvokeOnToolStripItem(ts => ts.Text = "ALARM signal received");