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それ自体と の2 つの部分がありますSubscription

あなたQueryIEnumerable<string>、コンピューターができる限りの速さで値を生成しています。

あなたのサブスクリプションは

SoapQueryEngine.Fetch(s);

これは、サブスクリプションを設定しているスレッドである傾向があるサブスクライバー スレッドでFetch生成された各文字列に対して実行されます (ただし、必ずしもそうとは限りません)。Query

この問題は、Rx の意図と設計に関係しています。は長時間実行されるプロセスであり、は結果を処理する短いメソッドです。長時間実行される関数を Rx Observable として実行する場合、最良のオプションはObservable.ToAsyncを使用することです。QuerySubscription

また、この質問を見て、バックグラウンドで何が起こっているかを示す同様の問題を確認する必要があります。

于 2013-09-22T04:49:39.630 に答える
0

この方法を試してください。イベント テキスト変更イベントをサブスクライブする代わりに、イベントでオブザーバブルを作成し、スレッド プールでそれを観察します。

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

Rx について本質的に同時発生するものは何もありません。Fetch を呼び出したい場合は、非同期になるように SoapQueryEngine を変更するか、別のスレッドで呼び出してから、結果を UI スレッドに戻す必要があります。

于 2013-09-22T00:36:50.907 に答える