2010-11-05 49 views
1

我正在使用BrowserControl导航到网站上的网页范围,然后解析HTML并提取有关书籍等的信息......我遇到了与线程相关的问题(我认为)...如何为WebBrowser控件处理线程

我有这样的事情。

// MAIN LOOP 
for (int i = 0; i < NumberOfPages; i++) 
{ 
    WebBrowser.Navigate("http://AWebSite/" + NumberOfPages.ToString()); 
} 

// HANDLE ON_LOADED EVENT 
void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
    // Retrieve HTMLDocument, Parse it etc 
    } 

现在,因为它需要几秒钟的事件,火灾控制导航到一个页面后,我有两个选择之一:

OPTION1 等待几秒钟,在我的主循环,像这样的:

for (int i = 0; i < NumberOfPages; i++) 
{ 
    WebBrowser.Navigate("http://www.mysite.com"); 

// wait for 5 seconds 
DateTime wait = new DateTime(); 
while (new DateTime().Ticks < wait.Ticks + 5000) 
    { 
    // not sure if I need do events here   
    } 
} 

OPTION2 另一个想法是一个全局变量为(布尔)标记,告知事件处理程序的页面仍然在下载(该标志设置为繁忙的主要外观,然后复位然后在重置后重置处理返回的html)。

我有一种感觉这两种方法都是笨拙的,真正有一个更好的办法就是以某种方式处理这两件事情(在不同的线程上运行?)

回答

0

您可以通过misuing迭代器做到这一点,因为我描述为here

例如:

interface IAction { void Execute(Action callback); } 

public static void ExecAction(IEnumerator<IAction> enumerator) { 
    if (enumerator.MoveNext()) 
     enumerator.Current.Execute(() => ExecAction(enumerator)); 
} 

class WaitForLoad : IAction { 
    void IAction.Execute(Action callback) { 
     //Handle the LoadCompleted event and call callback 
    } 
} 

IEnumerator<IAction> YourMethod() { 
    ... 
    for (int i = 0; i < NumberOfPages; i++) { 
     WebBrowser.Navigate("http://AWebSite/" + NumberOfPages.ToString()); 
     yield return new WaitForLoad(); 
    } 
    ... 
} 

你可以让这个更复杂的具有WaitForLoad检查正确的页面加载。

+0

谢谢,试图通读你的例子,但它看起来高于我的头:-(有没有更简单的方法来做到这一点,因为我不介意一次只提取一个url? – underwater 2010-11-06 17:29:57

1

是的,延迟很笨拙 - 它可能需要比这更长或更长的时间。

你需要WebBrowser控件吗?看起来你正在做一些批处理。如果是这样,System.Net.WebClient可能会为你工作。它具有阻塞和异步方法 - .DownloadData和.DoanloadDataAsync。

如果你需要它,我可以挖掘一些代码,但是快速搜索会显示一些例子。

+0

您好迈克,任何机会张贴一个简单的例子如何迭代通过多个导航到多个网址和管理来处理返回的HTML? – underwater 2010-11-06 17:25:48

+0

让我给你一个代码示例的链接 - 不是在我的开发箱 - http: //msdn.microsoft.com/en-us/library/xz398a3f.aspx。如果你愿意,你可以把它放在一个像你原来的帖子一样的循环中。如果你有问题,请告诉我们。 – 2010-11-07 19:34:03