2017-09-28 4 views
1

J'ai une liste d'URL dans une boucle for, en chargeant une URL à la fois, mais l'événement FinishLoadingFrameEvent n'est appelé qu'une seule fois.L'événement FinishLoadingFrameEvent est appelé une fois lors du chargement de plusieurs URL

Mon code complet est comme ça

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

Suis-je manque quelque chose?

+0

essayez de mettre le 'waitEvent.Reset();' après le 'waitEvent.WaitOne();' dans la boucle for – Izikon

+0

@Izikon essayé déjà .. – mathew

+0

Une question similaire a été posée ici: https: // stackoverflow .com/questions/45642333/dotnetbrowser-finishloadingframeevent-multiple-use/45669011 # 45669011 –

Répondre

2

Votre code semble fonctionner comme prévu pour mon ensemble d'URL.

Voici l'exemple de code complet avec toutes les modifications:

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

Vous pouvez remarquer que je l'ai commenté l'appel Thread.Sleep dans le gestionnaire d'événements. Le déconsachage fait simplement que tout fonctionne plus lentement, mais cela fonctionne toujours.

+0

J'ai déjà essayé ça, mais toujours FinishLoadingFrameEvent est seulement appelé la première fois de la boucle .. – mathew

+0

@mathew Est-il possible de mettre à jour la question originale avec SSCCE qui démontre le problème? –

+0

question mise à jour :) – mathew