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