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

Я использую system.timers.timer для своих услуг.

Теперь я создаю тестовую форму, в которой я тоже ее использую. В событии timer_Elapsed я выполняю некоторую работу и хочу остановить необходимый таймер (ххх мс) и записать его в элемент управления формы, чтобы показать.

Но когда я получаю доступ к списку, я получаю ошибку кросс-потока.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 27 ноября 2009

Ваш метод должен выглядеть так:

public void foo(int value, string message)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new Action<int, string>(foo), value, message);
        }
        else
        {
            // Stop the timer 
        }
    }
1 голос
/ 04 декабря 2014

При использовании System.Timers.Timer используйте свойство SynchronizingObject таймера. Очевидно, это вызывает метод, который обрабатывает событие Elapsed, для вызова в том же потоке, в котором был создан назначенный компонент (SynchronizingObject). например. если myButton - это элемент управления вашей формы (независимо от основного потока GUI),

 System.Timers.Timer myTimer = new System.Timers.Timer();
 myTimer.SynchronizingObject = this.myButton;

это приводит к тому, что обработчик Elapsed запускается в том же потоке, и устраняет некоторые ошибки «операции с несколькими потоками».

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

1 голос
/ 27 ноября 2009

Если вы хотите получить доступ к элементу управления из потока, отличного от основного потока пользовательского интерфейса, вам необходимо использовать метод Invoke для элемента управления, к которому вы хотите получить доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...