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

本文关键字:不离 离开 方法 在等待 Web 浏览器 文档 | 更新日期: 2023-09-27 17:58:56

我想等待网络浏览器完成页面加载,然后再做一些事情;然而,我不想离开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)
{
}

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

您可以将代码修改为这样。

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

这是异步编程的常见问题。正常的同步进程无法正常工作。

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

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

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

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