我开始学习CefSharp。这是用于网页抓取的便捷工具。但是我有一个问题。 我想等待页面被加载。但是页面加载是由ajax完成的。我正在等待一些html标签。 我这样写。
public ChromiumWebBrowser brser;
Thread main_thread;
public Form1()
{
brser = new ChromiumWebBrowser("some_url_here");
panelBrowser.Controls.Add(brser);
brser.Dock = DockStyle.Fill;
main_thread = new Thread(mainStart);
main_thread.Start();
}
private void mainStart()
{
brser.LoadingStateChanged += LoadingStateChanged;
brser.Load("other_url_here");
}
private async void LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
//... Omitted Code ...
Context.LogInfo("[LOG]\t----");
frame = brser.GetBrowser().GetFrame("iframe1");
if(frame == null)
{
Context.LogInfo("[LOG]\tiframe1 is null. return");
return;
}
int nretry = 100;
try
{
while (nretry > 0)
{
html = await Task.Run(frame.GetSourceAsync);
if (html.Contains("<ul class=\"some_class_to_be_loaded\">"))
{
break;
}
nretry--;
Thread.Sleep(100);
}
if (nretry == 0)
{
MessageBox.Show("Connection Error");
try
{
main_thread.Abort();
return;
}
catch (Exception ex)
{
return;
}
}
}
catch
{
return;
}
}
但是它不起作用。我调试了但是,当线程休眠时,页面加载也会休眠。结果,等待“加载完成事件”失败。请帮助我。
答案 0 :(得分:0)
您可以由代表包装您的等待部分。 这样。
Invoke(new Action(async delegate ()
{
//waiting code
int nretry = 100;
while (nretry > 0){
//...
Thread.Sleep(100);
}
}