c#wpf:等待webbrowser加载页面

时间:2016-12-02 23:21:25

标签: c# wpf webbrowser-control

我有一个wpf程序,我想添加一个WebBrowser控件

我搜索如何检查WebBrowser是否成功加载页面,这里是代码:

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 CompleteTask.IsCompleted在wpf中没有这样的属性。 wpf的代码是什么?

3 个答案:

答案 0 :(得分:2)

您可以只处理WebBrowser控件的LoadCompleted事件。当导航到的网页已完成下载时,将引发此事件:https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx

WebBrowser控件不提供您可以等待的任何异步API或Task属性。它只会引发一个事件,所以处理这个事件是你能做到的最好的事情:

webBrowser.LoadCompleted += (s, e) =>
{
    //the page has been loaded here. Do your thing...
};

如果你只想等待加载页面的“TimeOut”秒数,你可以使用你在LoadCompleted事件处理程序中发布的SemaphoreSlim:

    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...
            }
        }
    }

答案 1 :(得分:0)

我一直在尝试几乎所有建议的解决方案。这是解决我问题的那个。在尝试与页面交互之前调用此方法:

public void CheckWebBrowser()
{
       while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete )
            {
                Application.DoEvents();
            }
        return;
}

我希望它有所帮助!

答案 2 :(得分:0)

这个线程很旧,但是如果有人需要解决这个问题,这对我有用。

https