Как получить доступ к элементу управления формы из System.Timers.Timer (проблема перекрестного потока)
-
05-07-2019 - |
Вопрос
Я использую system.timers.timer для своего сервиса.
Теперь я создаю тест-форму, в которой я тоже ее использую. В событии timer_Elapsed я выполняю некоторую работу и хочу остановить таймер, который ему нужен (xxx мс), и записать его в элемент управления формы, чтобы показать.
Но когда я получаю доступ к списку, я получаю перекрестную ошибку.
Есть идеи?
Решение
Если вы хотите получить доступ к элементу управления из потока, отличного от основного потока пользовательского интерфейса, вам необходимо использовать Вызвать метод элемента управления, к которому вы хотите получить доступ.
Другие советы
Ваш метод должен выглядеть следующим образом:
public void foo(int value, string message)
{
if (InvokeRequired)
{
BeginInvoke(new Action<int, string>(foo), value, message);
}
else
{
// Stop the timer
}
}
При использовании System.Timers.Timer используйте свойство SynchronizingObject
таймера. Очевидно, это вызывает метод, который обрабатывает событие Elapsed, для вызова в том же потоке, в котором был создан назначенный компонент (SynchronizingObject).
например. если myButton - это элемент управления вашей формы (независимо от основного потока графического интерфейса),
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.SynchronizingObject = this.myButton;
это приводит к тому, что обработчик Elapsed запускается в том же потоке, удаляет некоторые ошибки «операции с несколькими потоками».
Пожалуйста, обратите внимание: у меня очень мало знаний о том, является ли это потокобезопасным, но он работал нормально для меня в конкретном случае использования. Надеюсь, это поможет в любом случае.