C#WPF:等待网页浏览器加载页面
问题描述:
我有,我想添加一个WebBrowser控件C#WPF:等待网页浏览器加载页面
我搜索如何检查web浏览器加载页面成功与否,这里是代码中的WPF程序:
private async Task PageLoad(int TimeOut)
{
TaskCompletionSource<bool> PageLoaded = null;
PageLoaded = new TaskCompletionSource<bool>();
int TimeElapsed = 0;
webBrowser.LoadCompleted += (s, e) =>
{
if (webBrowser.ReadyState != webBrowser.Complete) return;
if (webBrowser.Task.IsCompleted) return;
PageLoaded.SetResult(true);
};
while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
{
//interval of 10 ms worked good for me
await Task.Delay(10);
TimeElapsed++;
if (TimeElapsed >= TimeOut * 100)
{
//This prevents your method or thread from waiting forever
PageLoaded.TrySetResult(true);
}
}
}
但是,为什么它不适用于wpf。我如何转换它?
我检查了它并且ReadyState
Complete
和Task.IsCompleted
在wpf中没有这样的属性。什么是wpf的代码?
答
您可以只处理WebBrowser控件的LoadCompleted事件。当导航到的网页已完成下载时,将引发此事件:https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx
WebBrowser控件未提供任何可等待的异步API或任务属性。它只是引发一个事件,以便处理该事件的是你能做到真正的最好的事情:
webBrowser.LoadCompleted += (s, e) =>
{
//the page has been loaded here. Do your thing...
};
如果你只是想等待“超时”的秒数,以得到加载例如,你可以使用SemaphoreSlim页面您发布在LoadCompleted事件处理程序中:
private async Task LoadPageAsync(string url, int timeOutInSeconds)
{
using (System.Threading.SemaphoreSlim semaphore = new System.Threading.SemaphoreSlim(0, 1))
{
bool loaded = false;
webBrowser.LoadCompleted += (s, e) =>
{
semaphore.Release();
loaded = true;
};
webBrowser.Navigate(url);
await semaphore.WaitAsync(TimeSpan.FromSeconds(timeOutInSeconds));
if (loaded)
{
//page was loaded
}
else
{
//page was not loaded...
}
}
}
答
我一直在尝试几乎所有建议的解决方案。这是解决我的问题的那个。在尝试与页面交互之前调用此方法:
public void CheckWebBrowser()
{
while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
return;
}
我希望它有帮助!
[.NET的WebBrowser类的异步/等待实现]的可能重复(http://*.com/questions/8610197/async-await-implementation-of-webbrowser-class-for-net) –
检查该网页加载是一个可疑的事情。网页浏览器控件和IE都可以让你连接到document.complete事件。但当然问题是,许多javascript框架也只有在文档加载完成后才开始加载。因此,您可以触发document.complete事件,但仍可以运行脚本,以动态方式添加更多网页。 –