暂停执行在UI线程上运行的方法

时间:2017-01-31 20:28:52

标签: c# .net wpf c#-4.0

我有一个带有浏览器控件的窗口。当有人关闭窗口时,我需要将浏览器控件导航到特定的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,因为它会导致UI线程休眠。在NavigationFinised变为true之前,我无法找到暂停执行OnBeforeClose的方法。不阻止UI线程。

更新:将以下循环添加到为我工作的OnBeforeWindowClose方法

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

但我想知道是否有更好的方法来实现这一点而不是在.Net 4.0中使用循环

1 个答案:

答案 0 :(得分:0)

这有点可以解决,但可以满足您的要求:

  • 收听闭幕活动。
  • 当Windows_Closing处理程序正在执行时,请检查浏览器当前URL:如果它不是&#34;新URL&#34;然后取消结束事件(请参阅https://msdn.microsoft.com/en-us/library/system.windows.window.closing(v=vs.110).aspx
  • 接下来挂钩Webbrowser上的LoadCompleted,然后将浏览器URL设置为&#34; new URL&#34;当LoadCompleted处理程序命中时再次调用Windows.Close()方法(当浏览器URL已经设置为&#34;新URL&#34;再次执行close方法时,可以再次从LoadCompleted取消挂钩)。

所以这里的想法是通过取消 - 做某事来实现暂停 - 然后以编程方式重新闭合。