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";
}