1

我在 for 循环中有一个 url 列表,一次加载一个 url,但 FinishLoadingFrameEvent 事件只调用一次。

我的完整代码是这样的

private List<string> urls = //fetch from db;
ManualResetEvent waitEvent = new ManualResetEvent(false);
BrowserView webView = new WPFBrowserView();
string path = //my local path;

public MainWindow()
{
    InitializeComponent();

    mainLayout.Children.Add((UIElement)webView.GetComponent());


    webView.Browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e)
    {
        System.Threading.Thread.Sleep(5000);

        if (e.IsMainFrame)
        {
            DOMDocument document = e.Browser.GetDocument();
            var html = document.DocumentElement.InnerHTML;

            System.IO.File.WriteAllText(path, html);
            waitEvent.Set();
        }
    };

    foreach (var url in urls)
    {
            webView.Browser.LoadURL(url);
            waitEvent.WaitOne();
            waitEvent.Reset();
    }
}

我错过了什么吗?

4

1 回答 1

2

对于我的一组 URL,您的代码似乎可以正常工作。

这是包含所有修改的完整示例代码:

public partial class MainWindow : Window
{
    private List<string> urls = new List<string>
        { "google.com", "microsoft.com", "teamdev.com", "teamdev.com/dotnetbrowser" };
    ManualResetEvent waitEvent = new ManualResetEvent(false);
    BrowserView webView = new WPFBrowserView();
    string path = "html.txt";

    public MainWindow()
    {
        InitializeComponent();

        mainLayout.Children.Add((UIElement)webView.GetComponent());


        webView.Browser.FinishLoadingFrameEvent += delegate (object sender, 
            FinishLoadingEventArgs e)
        {
            //System.Threading.Thread.Sleep(5000);

            if (e.IsMainFrame)
            {
                DOMDocument document = e.Browser.GetDocument();
                var html = document.DocumentElement.InnerHTML;

                System.IO.File.WriteAllText(path, html);
                waitEvent.Set();
            }
        };

        foreach (var url in urls)
        {
            Debug.WriteLine($"Loading {url}");
            webView.Browser.LoadURL(url);
            waitEvent.WaitOne();
            Debug.WriteLine($"{url} loaded");
            waitEvent.Reset();
        }
    }
}

您可以注意到我已经Thread.Sleep在事件处理程序中注释掉了调用。取消注释只会让一切运行得更慢,但它仍然有效。

于 2017-09-28T07:53:01.083 回答