C # WinForms: System.InvalidCastException только из Timer.ElapsedEventHandler - PullRequest
0 голосов
/ 25 апреля 2018

Я создал проект C # WinForms с веб-браузером и отдельными элементами управления, чтобы нажимать определенные кнопки в веб-браузере, пока что все работает нормально. Тем не менее, одна из этих кнопок должна нажиматься с регулярными интервалами (я выбрал 20 секунд для отладки). Я пытаюсь щелкнуть по нему с помощью System.Timers.Timer, который запускается при событии .Elapsed.

webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");

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

Странно то, что нажатие кнопки или заполнение текстового поля прекрасно работает, когда я делаю это с событием Button_Click.

Проблема, очевидно, не в том, что элемента html нет, я получаю то же исключение в предложении if, в строке if (element! = Null).

Ниже приведен еще мой код:

System.Timers.Timer t = new System.Timers.Timer(20 * 1000);

SomeMethodAtTheStart()
{
   t.Start();
   t.AutoReset = true;
   t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
}

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
   webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");
}

private void tsmiConnect_Click(object sender, EventArgs e)
{
   webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");
}

Буду очень признателен, если кто-нибудь сможет мне помочь.

1 Ответ

0 голосов
/ 25 апреля 2018

С MSDN

В отличие от System.Windows.Forms.Timer, класс System.Timers.Timer по умолчанию вызывает ваш обработчик событий таймера в рабочем потоке, полученном из пула потоков общеязыковой среды выполнения (CLR). Это означает, что код в вашем обработчике событий Elapsed должен соответствовать золотому правилу программирования Win32: к экземпляру элемента управления никогда не следует обращаться из любого потока, кроме потока, который использовался для его создания.

Вместо этого используйте System.Windows.Forms.Timer.

Редактировать: как в этот ответ на вопрос InvalidCastException при использовании веб-браузера и потоков

Веб-браузеру не нравится доступ из других потоков.

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