Как получить доступ к элементу управления формы из System.Timers.Timer (проблема перекрестного потока)

StackOverflow https://stackoverflow.com/questions/1809864

  •  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 запускается в том же потоке, удаляет некоторые ошибки «операции с несколькими потоками».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top