【发布时间】:2016-01-22 23:04:46
【问题描述】:
给定:一个扩展方法,采用 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();
});
在调用 OnCompleted 之前,谁能帮我确定 GUI 线程阻塞的根本原因。如果我在第一种方法中使用 Task.Run,我可以停止阻塞,但是我必须将集合编组回 GUI 线程。
这个阻塞是因为 GUI 线程启动了 Observable 用来提取元素的 Webdriver 吗?
或者这是因为在 GUI 线程启动时创建的静态方法?
【问题讨论】:
-
如果你这样做了 -
Disposable.Create(() => { })- 你做错了什么。使用Observable.Create的方式是一种阻塞操作。.Create中的代码是订阅的一部分,但您在订阅期间运行观察者完成,这就是它阻塞的原因。
标签: c# wpf selenium system.reactive