【问题标题】:FinishLoadingFrameEvent event is called once when loading multiple urls加载多个 url 时调用一次 FinishLoadingFrameEvent 事件
【发布时间】:2018-03-09 19:56:37
【问题描述】:

我在 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();
    }
}

我错过了什么吗?

【问题讨论】:

标签: c# dotnetbrowser


【解决方案1】:

对于我的一组 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 调用。取消注释只会让一切运行速度变慢,但它仍然有效。

【讨论】:

  • 我已经尝试过了,但 FinishLoadingFrameEvent 仍然只在循环的第一次调用..
  • @mathew 是否可以使用 SSCCE 更新原始问题来证明该问题?
  • 我已经用修改后的示例代码更新了我的答案。它对我的网址按预期工作。请注意,我已经在事件处理程序中注释掉了 Thread.Sleep 调用。取消注释只会让一切运行速度变慢,但它仍然有效。
  • 真的很感谢所有的帮助和建议,但没有运气:(我有 Thread.Sleep 因为所有页面都有一个加载器并且需要 2-3 秒来加载整个页面。也许这有和这个问题有什么关系?
  • FinishLoadingFrameEvent 会为网页上的每个框架触发,而不仅仅是主框架。因此,如果您的页面包含大量帧,则可能需要几分钟才能完全加载它,因为将为每个帧执行 Thread.Sleep()
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2020-09-04
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
相关资源
最近更新 更多