基本上我正在自动化一个拥有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.