0

基本上,我正在自动化一个具有 iframe 并且不会触发 DocumentComplete 的站点。我在一个独立的线程中运行一个表单,其中包含一个 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.
4

0 回答 0