C# 如何在触发指定事件之前挂起流程流?网络浏览器控制
我的问题是执行C# 如何在触发指定事件之前挂起流程流?网络浏览器控制,c#,wpf,asynchronous,webbrowser-control,C#,Wpf,Asynchronous,Webbrowser Control,我的问题是执行WebBrowser.Navigate()时如何等待LoadCompletedEvent() 我想在我的WPF应用程序中使用一个简单的WebBrowser控件,想象一下浏览器和一个按钮,然后在按钮上单击()我想让我的WebBrowser导航到指定的URL使用一个用户登录,然后注销该网站并使用另一个用户登录。 我想至少表演10到100次,我不介意 当我有我的按钮ClickEvent时,将会有我所有必要的代码来执行我的循环和一切,但是当我执行WebBrowser.Navigate(),
WebBrowser.Navigate()
时如何等待LoadCompletedEvent()
我想在我的WPF应用程序中使用一个简单的WebBrowser控件,想象一下浏览器和一个按钮,然后在按钮上单击()
我想让我的WebBrowser
导航到指定的URL使用一个用户登录,然后注销该网站并使用另一个用户登录。
我想至少表演10到100次,我不介意
当我有我的按钮ClickEvent
时,将会有我所有必要的代码来执行我的循环和一切,但是当我执行WebBrowser.Navigate()
,在按钮ClickEvent
的子进程中,它不会在任何地方导航,直到事件完全完成。例如:
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)
{
.....
}
只是伪代码
文本输入不会被执行,而是会给出一个错误,因为浏览器仍然无法导航到URL
我试图用一个异步线程来更新UI,该线程支持更新UI。。。没什么,UI一点也不动。
WebBrowserControl是异步的,因此如何使用Async await
异步等待LoadCompletedEvent?
我试图从一个线程导航到URL,通过一个简单的循环和Bool变量,我等待LoadCompletedEvent,但它从未被抛出。当然,我在Dispatcher.Invoke/BeginInvoke()
上尝试了不同的优先级,但也没有任何令人满意的结果。
我还在LoadCompletedEvenet
中尝试了Semaphore
,但也没有结果。
所有这些似乎都是同步事件处理
有什么想法吗?您可以使用
任务完成源代码等待任何事情:
专用任务NavigateAsync(字符串url)
{
var tcs=new TaskCompletionSource();
LoadCompletedEventHandler订阅=null;
订阅=(u,u)=>
{
browser.LoadCompleted-=订阅;
tcs.TrySetResult(空);
};
browser.LoadCompleted+=订阅;
浏览器.导航(url);
返回tcs.Task;
}
私有异步void按钮ClickEvent(对象发送方,事件参数e)
{
等待导航同步(URL);
browser.FindElementByID(“用户”).Text=“abc”;
}
感谢您的快速回答,但我还尝试声明了一个私有异步事件()
它抛出我和编译错误,那么,使用哪个库可以像您在示例中那样将事件声明为async
?如何将任务NavigateAsync
放在另一个类中?@user3167232:我会将NavigateAsync
作为WebBrowser
的扩展方法。但问题是同步代码将继续处理。所以你的解决方案很好,但是如果我让Button\u Click事件保持同步并调用一个异步方法,那么Button\u Click就不会等待任何结果,也不会持续。我会把我的问题修改得更好understanding@user3167232:您需要使按钮单击事件处理程序异步,如我的代码示例所示。
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";
}