等待Web浏览器文档完成而不离开方法

时间:2013-02-13 22:58:12

标签: c# winforms webbrowser-control

我想等待webbrowser完成加载页面并在之后做一些事情;但是我不想离开main方法,因为我将根据浏览器页面读取的值返回bool。

这是我尝试但显然我要离开主要方法

    public async Task<bool> Commit()
    {
        try
        {
            Browser = new WebBrowser { ScriptErrorsSuppressed = true };

            Browser.Navigate(Server);
            Browser.DocumentCompleted += DocumentCompleteMethod;

//HERE I WANNA RETURN TRUE,FALSE DEPENDING ON THE VALUE I WILL READ FROM THE WEB PAGE
        }
        catch (Exception ex)
        {
            return false;
        }
        return true;
    }

private void DocumentCompleteMethod(object sender, WebBrowserDocumentCompletedEventArgs e)
{

}

3 个答案:

答案 0 :(得分:2)

这是异步编程的常见问题。您的正常同步过程不能像您希望的那样工作。

考虑使用异步方法重新构建您的流程。不要返回值,启动流程并让流程处理要采取的操作。例如,让DocumentCompleteMethod根据页面的结果采取行动。

如果您真的必须强制异步进程符合同步方法,那么请考虑使用AutoResetEvent之类的线程同步器。 Jon Skeet在StackOverflow上发布了关于在线程中执行WebBrowser.Navigate方法的问题的一个很好的答案。

答案 1 :(得分:2)

您可以将代码修改为此。

  public async Task<bool> Commit()
        {
            try
            {
                var Browser = new WebBrowser { ScriptErrorsSuppressed = true };

                Browser.Navigate(Server);
                Browser.DocumentCompleted += DocumentCompleteMethod;

               while (Browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }

   //At this point you can access the document as it is sure to be loaded.
   string title = Browser.Document.Title;

    //HERE I WANNA RETURN TRUE,FALSE DEPENDING ON THE VALUE I WILL READ FROM THE WEB PAGE
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

    private void DocumentCompleteMethod(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }

答案 2 :(得分:1)

我今天创建了这个类,在stackoverflow的另一个帖子的帮助下,我希望得到准备好的webbrowser控件,而不使用任何线程阻塞(Async / Await)。

Dim bb = New wbBrowser
Dim wb = Await bb.GetBrowserAsync("http://www.msn.com")

这是班级:

Imports System.Threading
Imports System.Threading.Tasks

Public Class wbBrowser
    Implements IDisposable

    Dim m_wbBrowser As New WebBrowser
    Dim m_tcs As TaskCompletionSource(Of WebBrowser)

    Public Sub New()
        m_wbBrowser.ScrollBarsEnabled = False
        m_wbBrowser.ScriptErrorsSuppressed = False
        AddHandler m_wbBrowser.DocumentCompleted, Sub(s, args) m_tcs.SetResult(m_wbBrowser)
    End Sub

    Public Async Function GetBrowserAsync(ByVal URL As String) As Task(Of WebBrowser)
        m_wbBrowser.Navigate(URL)
        Return Await WhenDocumentCompleted(m_wbBrowser)
    End Function

    Private Function WhenDocumentCompleted(browser As WebBrowser) As Task(Of WebBrowser)
        m_tcs = New TaskCompletionSource(Of WebBrowser)
        Return m_tcs.Task
    End Function

    Private disposedValue As Boolean
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                m_wbBrowser.Dispose()
            End If
        End If
        Me.disposedValue = True
    End Sub
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub

End Class