【发布时间】:2011-09-07 03:57:24
【问题描述】:
我知道这有been asked before,但我认为these solutions 不灵活。 DocumentCompleted 事件应该用于确定加载何时完成,而不是作为执行工作的方法。如果您需要执行多个不同的任务,每个任务都必须导航多次,将逻辑放在DocumentCompleted 事件中会将其变成一个难以阅读和维护的杂乱开关/外壳路由器。
您需要一些可以在您的方法执行导航期间实际等待的东西,以便您可以在您已经使用的方法中继续您的任务。我的第一个虽然是实际的 Wait() 方法。
我认为这样的事情很接近:
void WaitForLoad()
{
isLoading = true;
while (isLoading)
{
if (Application.Current == null) break;
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, (DispatcherOperationCallback)delegate(object unused) { return null; }, null);
}
}
并在DocumentCompleted 事件中将 Isloading 设置为 false。
您应该能够在任何会导致页面加载的操作之后调用此方法。它有效,它有一些问题。
1) 在页面加载之前,它会将应用程序的 CPU 使用率提高到 35%,即使没有发生其他任何事情。
2) 如果应用程序在运行时尝试关闭,则循环将继续运行并使应用程序保持打开状态而没有窗口,因此当应用程序为空时需要中断。
这个问题可以解决吗,还是我搞错了?
编辑:我尝试在下面实施 ManualResetEvent 解决方案,但它导致了其他几个问题,我不确定是否可以在不造成比上述情况更混乱的情况下解决这些问题。由于 WebBrowser 在 UI 上,锁定线程会停止整个应用程序。如果工作在后台线程上完成,它可以被锁定,但是访问 WebBrowser 变得非常困难。
【问题讨论】:
-
所以您正在寻找一种在等待文档完成加载时阻塞线程的方法?
-
我不熟悉应用于线程的“块”这个术语。这听起来像我想要的,但我不确定。在 Google 中搜索“阻止”没有帮助,因为阻止在代码中具有不同且更常见的含义。
-
阻塞线程意味着它在被解除阻塞之前不再执行;又名,
lock语句将阻塞所有线程,并且一次只让一个线程通过临界区。谷歌线程阻塞。 -
同步事件看起来很有希望,我会看看是否可以使用 ManualResetEvent 来完成这项工作。谢谢你的提示。