正在等待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)
{
}
您可以将代码修改为这样。
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