尝试自动化WebBrowser C#时出现InvalidCastException

时间:2014-04-02 22:33:09

标签: c# multithreading browser autoresetevent

基本上我正在自动化一个拥有iframe但不会触发DocumentComplete的网站。我在一个独立的线程中运行一个Form,它包含一个WebBrowser。我正在尝试在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.

0 个答案:

没有答案