2017-01-31 5 views
-1

У меня есть окно с контролем браузера внутри него. Когда кто-то закрывает окно, мне нужно перейти к управлению браузером на определенный URL-адрес, и только после того, как браузер завершит навигацию, окно нужно закрыть.Приостановка выполнения метода, выполняющегося в потоке пользовательского интерфейса

Когда окно закрыто, вызывается метод OnBeforeWindowClose(Eventargs e).

OnBeforeWindowClose(Eventargs e) 
{ 

// As soon as the URL property is set the browser control navigates to the URL 

URL = "new URL"; 

//I need to wait till the browser is done navigating. Based on the NavigationFinished property below 

} 

bool NavigationFinished {set; get;} 

Я не могу использовать Thread.Sleep, потому что это приведет поток пользовательского интерфейса спать. Я не могу найти способ приостановить выполнение OnBeforeClose до тех пор, пока NavigationFinised не станет истинным. Без блокировки потока пользовательского интерфейса.

UPDATE: Добавление следующего цикла в OnBeforeWindowClose метод работало для меня

do 
     { 
      var dateTime = DateTime.Now.AddSeconds(2); 
      while (DateTime.Now < dateTime) 
      { 
       System.Windows.Forms.Application.DoEvents(); 
      } 
     } while (!NavigationFinished); 

Но мне было интересно, если есть лучший способ сделать это вместо того, чтобы использовать петлю в .Net 4.0

+0

Вы ищете 'await'. – SLaks

+0

Его нет в .net 4.0 :( – Kaddy

+0

Установите 'Microsoft.Bcl.Async' на NuGet. – SLaks

ответ

0

Это несколько работает, но может работать по вашему требованию:

  • Слушайте событие закрытия окна.
  • Когда обработчик Windows_Closing выполняется затем проверить браузер текущий URL: если это не «новый URL», а затем Отменить событие закрытия (см https://msdn.microsoft.com/en-us/library/system.windows.window.closing(v=vs.110).aspx)
  • Следующий крюк в LoadCompleted на Webbrowser, а затем установить URL браузера на «новый URL», и когда обработчики LoadCompleted снова обращаются, снова вызовите метод Windows.Close() (вы можете снова отцепить от LoadCompleted, когда URL-адрес браузера уже установлен на «новый URL-адрес», когда метод close снова выполняется).

Итак, идея здесь сделать паузу, отменив - что-то делать, - затем повторное включение программно.

+0

Закрытие окна фактически вызывается из закрытия приложения. И я не могу вызвать метод закрытия приложения, то есть я не могу программно заново закрыть :(Мне как-то нужно p ause onBeforeClose метод на полпути и возобновить его после навигации браузера. – Kaddy