0

我重写了我的一些旧异步代码,这些代码可以进行 SOAP 调用。fetch() 方法将退出,从 SOAP 接口获取结果,然后将其添加到绑定到我的 WPF 视图的 DataTable 中。新代码使用 Reactive Extensions 来获取字符串列表并从列表中创建一个 IObservable。我认为它会异步返回结果,但整个 UI 会锁定,直到整个结果集准备好。我是 Reactive Extensions 的新手,所以我希望我只是缺少一些简单的东西。

编码:

(来自点击事件)

   private void fetchSoapRows()
   {
       var strings = (txtInput.Text.Split('*')).ToObservable();
       strings.Subscribe(s=> SoapQueryEngine.Fetch(s));
   } 

另外,有谁知道我如何编写测试以确保此方法将来不会阻止应用程序?

4

3 回答 3

2

可观察查询有两个部分,它Query本身和Subscription.

Query是一个IEnumerable<string>像计算机一样快地产生价值的东西。

您的订阅是

SoapQueryEngine.Fetch(s);

这将针对订阅者线程中Fetch生成的每个字符串运行,Query该线程往往是您设置订阅的线程(尽管不一定)。

这个问题与 Rx 的意图和设计有关。这一个Query长期运行的过程,Subscription是一个处理结果的简短方法。如果您想将长时间运行的函数作为 Rx Observable 运行,您最好的选择是使用Observable.ToAsync

您还应该查看这个问题以查看类似的问题,该问题显示了更多在后台发生的事情。

于 2013-09-22T04:49:39.630 回答
0

Rx 本质上没有任何并发​​性。如果要调用 Fetch,则需要更改 SoapQueryEngine 使其异步或在另一个线程上调用它,然后将结果返回到 UI 线程。

于 2013-09-22T00:36:50.907 回答
0

试试这个方法。与其订阅事件文本更改事件,不如在事件上创建一个 observable 并在线程池上观察它:

Observable.FromEventPattern(<subscribe event>, <unsubscribe event>)
.ObserveOn(ThreadPoolScheduler.Instance)
.SelectMany(s => s.Split('*'))
.Subscribe(s=> SoapQueryEngine.Fetch(s));
于 2013-09-22T19:59:20.830 回答