4

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

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

    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)
{

}
4

3 回答 3

2

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

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

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

于 2013-02-13T23:05:19.897 回答
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)
    {

    }
于 2013-02-13T23:08:10.953 回答
1

我今天创建了这个类,在 stackoverflow 上的另一篇文章的帮助下,我想使用 (Async/Await) 在没有任何线程阻塞的情况下获得准备好的 webbrowser 控件。

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
于 2014-02-24T09:37:17.900 回答