InvalidCastException при попытке автоматизировать WebBrowser С#

По сути, я автоматизирую сайт с iframe и не запускаю DocumentComplete. Я запускаю форму в независимом потоке, который содержит WebBrowser. Я пытаюсь щелкнуть поиск в веб-браузере, он работает нормально, но я пытаюсь отделить браузер от формы по потокам, чтобы я мог сделать свой код в целом более процедурным и реализовать AutoResetEvent.

Вот метод поиска по клику:

    public void ClickSearch()
    {
        if (search == null)
        {
            HtmlElementCollection links = Document.Window.Frames[0].Frames[1].Document.Links;
            search = links.Cast<HtmlElement>()
                 .Where(x => x != null)
                 .FirstOrDefault(x => x.InnerText == "Search");
        }
        Doc.InvokeScript("htmlbSL", new object[]{search, 2, search.Id+":SEARCH", '0'});
    }

Вот код, который его вызывает:

            var evt = new AutoResetEvent(false);
            HtmlElementEventHandler handler = null;
            handler = new HtmlElementEventHandler(
                delegate(object sender, HtmlElementEventArgs ev)
            {
                ev.BubbleEvent = false;
                smsBrowser.Doc.Focusing -= handler;

                worklist = new Worklist();
                worklist.Load(smsBrowser.GetWorklistCsv());

                SQLiteDatabase.InsertWorklist(worklist);
                SQLiteDatabase.Commit();
                SQLiteDatabase.FillWorklistGrid();

                evt.Set();
            });

            smsBrowser.Doc.Focusing += handler;

            Task.Factory.StartNew(() => smsBrowser.ClickSearch());

            evt.WaitOne();

Линия:

HtmlElementCollection links = Document.Window.Frames[0].Frames[1].Document.Links;

дает мне InvalidCastException. Кроме того, любые советы о том, как лучше всего это сделать, будут высоко оценены, я хочу избегать Application.DoEvents(), я также хочу, чтобы это было больше процедур (у меня есть много событий, присоединяющихся и отсоединяющихся). Вызывающий метод также работает в обработчике событий, я хотел бы поместить их в один и тот же метод с реализованными ожиданиями для очистки моего кода.

Ранее я следовал этому руководству: http://www.albahari.com/threading/part2.aspx.

Вот детали исключения, хотя они не очень помогают.

An exception of type 'System.InvalidCastException' occurred in System.Windows.Forms.dll but was not handled in user code

Additional information: Specified cast is not valid.

person Darth_Evil    schedule 02.04.2014    source источник
comment
У вас есть детали исключения? Обычно он точно указывает, в чем проблема... Кстати: попробуйте задавать по одному вопросу за раз, если хотите получить ответ. Некоторые люди хорошо работают с веб-браузером, некоторые с многопоточностью... труднее найти людей, которые хорошо работают с обоими...   -  person Gabriel GM    schedule 03.04.2014
comment
Я предоставил детали исключения. Никак не помогают... Я не кастинг. Проблема связана с потоковой передачей и попыткой асинхронного выполнения ClickSearch. Это может работать синхронно, но блокирует браузер.   -  person Darth_Evil    schedule 03.04.2014
comment
Я не профессионал, но элементы GUI редко любят многопоточность. Это должны делать делегаты. См.: c Sharp System invalidcastException или c Sharp invalidcastexception   -  person Gabriel GM    schedule 03.04.2014
comment
Это решило проблему с InvalidCastException. Теперь проблема заключается в использовании AutoResetEvent с веб-браузером. Я тоже не эксперт, но я верю, что код браузера и формы блокируется, потому что они находятся в одном и том же цикле обмена сообщениями. Таким образом, код блокируется в evt.WaitOne();, метод ClickSearch() срабатывает, но, по сути, событие никогда не срабатывает.   -  person Darth_Evil    schedule 03.04.2014