我的问题是当我执行await LoadCompletedEvent()
时如何WebBrowser.Navigate()
。
我想在我的WPF应用程序中使用一个简单的WebBrowserControl,想象一下浏览器和一个按钮,并在Button.Click()
上我希望我的WebBrowser
导航到指定的URL执行一个用户登录,然后注销Webside和另一个用户登录。
我想要表演至少10或100次,我不介意。
当我拥有ButtonClickEvent
时,将会执行我的所有必要代码以执行我的循环和所有内容,但是当我执行WebBrowser.Navigate()
时,在ButtonClickEvent
的子流程中或其中,它不会导航到任何地方,直到事件完成。例如:
private ButtonClickEvent( object sender, EventArgs e)
{
browser.Navigate(URL);
this.wait() //-> some type of waiting for WebBrowser.LoadCompleteEvent
browser.FindElementByID("User").Text = "abc";
}
private async void wait()
{
await NavigateAsync(URL);
}
public static Task NavigateAsync(string url)
{
.....
}
Just PseuodoCode
文本输入不会被执行,而是会出错,因为浏览器仍然没有导航到URL。
我尝试使用异步线程来更新UI,这样可以更新UI ...没有什么,UI不会移动一点。
WebBrowserControl是异步的,那么如何使用Async Await
异步等待LoadCompletedEvent呢?
我试图从一个线程导航到URL,并使用一个简单的循环和Bool Var我等待LoadCompletedEvent,但它永远不会被抛出。当然,我在Dispatcher.Invoke/BeginInvoke()
上尝试了不同的优先级,但也没有任何令人满意的结果。
我还在Semaphore
中尝试LoadCompletedEvenet
,但也没有结果。
所有这些似乎都是同步的事件处理......
有些想法?
答案 0 :(得分:1)
您可以await
使用TaskCompletionSource<T>
任何内容:
private Task NavigateAsync(string url)
{
var tcs = new TaskCompletionSource<object>();
LoadCompletedEventHandler subscription = null;
subscription = (_, __) =>
{
browser.LoadCompleted -= subscription;
tcs.TrySetResult(null);
};
browser.LoadCompleted += subscription;
browser.Navigate(url);
return tcs.Task;
}
private async void ButtonClickEvent( object sender, EventArgs e)
{
await NavigateAsync(URL);
browser.FindElementByID("User").Text = "abc";
}