如何触发挂起进程直到指定的事件被触发? Web浏览器控件

时间:2014-01-17 14:20:51

标签: c# wpf asynchronous webbrowser-control

我的问题是当我执行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,但也没有结果。 所有这些似乎都是同步的事件处理......

有些想法?

1 个答案:

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