gpt4 book ai didi

c# - 为什么这个 Observable 会阻塞 WPF GUI 线程 (C#)?

转载 作者:行者123 更新时间:2023-11-30 23:31:15 25 4
gpt4 key购买 nike

给定:采用 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 中的代码是订阅的一部分,但您在订阅期间运行观察器直到完成,这就是它阻塞的原因。

尝试做这样的事情:

public static IObservable<ObservableCollection<WebElementWrapper>>
GetAllElementsAsObservable(this IWebDriver wd)
{
return Observable.Create<ObservableCollection<WebElementWrapper>>(observer =>
Observable
.Start(() =>
wd
.FindElements(By.CssSelector("*"))
.ToWebElementObservableCollection())
.Subscribe(observer));
}

关于c# - 为什么这个 Observable 会阻塞 WPF GUI 线程 (C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com