我想等待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)
{
}
答案 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