给定:一个扩展方法,接受 Selenium IWebdriver 实例并返回 IObservable。
public static IObservable<ObservableCollection<WebElementWrapper>>
GetAllElementsAsObservable(this IWebDriver wd)
{
return Observable.Create<ObservableCollection<WebElementWrapper>>(
(IObserver<ObservableCollection<WebElementWrapper>> observer) =>
{
var eles = wd.FindElements(By.CssSelector("*"));
var list = eles.ToWebElementObservableCollection();
observer.OnNext(list);
observer.OnCompleted();
return Disposable.Create(() => { });
});
}
以下是调用上述方法的代码(运行在GUI线程中)...
//GUI Will Freeze on this call until OnCompleted is called
cd.GetAllElementsAsObservable().Subscribe((WEWList) =>
{
WebElementCollection = WEWList;
SetNavigationItems();
});
能否有人帮我确定GUI线程被阻塞直到OnCompleted被调用的根本原因。如果我在第一个方法中使用Task.Run,我可以停止阻塞,但是这样我就必须将集合移回GUI线程。
这是否是因为GUI线程启动了Webdriver,而Observable正在使用它来提取元素导致的?
还是因为静态方法在GUI线程的启动时间被创建造成的?
Disposable.Create(() => { })
- 说明你正在做一些错误的操作。以你目前使用的方式,Observable.Create
是一个阻塞操作。.Create
内部的代码是订阅的一部分,但你在订阅期间完全运行了观察者,这就是为什么它是阻塞的。 - Enigmativity