У меня есть простая метка состояния, которую я часто обновляю во время длительной работы. Процедура работает по таймеру и, следовательно, в другом потоке, поэтому я получаю ошибку Cross-thread operation not valid. Я нашел исправление для SO, которое выглядит так:

lblQuery1Status.Invoke(new Action(delegate
{
    lblQuery1Status.Text = "Status: Publishing";
}));

Однако я обновляю текст этого элемента управления 7 или 8 раз во время процедуры. Есть ли более эффективный или простой способ сделать это?

0
THE JOATMON 8 Сен 2016 в 21:47

2 ответа

Лучший ответ

Если вы хотите «упростить» синтаксис, вы всегда можете использовать встроенную лямбду, чтобы «сократить» синтаксис:

lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

Вы также можете создать переменную действия для вызова и повторно вызывать действие при необходимости:

Action updateStatus = () => 
    lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

Затем вы можете вызывать его как метод столько раз, сколько необходимо:

updateStatus();
3
David L 8 Сен 2016 в 19:14

К сожалению, это лучший способ передать данные из долго выполняющейся задачи / потока в поток пользовательского интерфейса, у маршалинга есть свои накладные расходы, но если вы не вызываете его сотни раз в секунду, я думаю, с вами все будет в порядке 😊

0
Scott Perham 8 Сен 2016 в 18:54