2011-11-14 18 views
1

私のサービスメソッドはリスナーを取り、それをデータストリームで呼び出す。このストリームをIObservable<T>に変換しようとしています。これまでのところ、これは私がやったことです:ストリームのリスナーをIObservableに変換する

public class MessageListener : IMessageListener 
{ 

    private readonly Subject<string> stream = new Subject<string>(); 

    public IObservable<string> MessageStream 
    { 
     get 
     { 
      return this.stream; 
     } 
    } 

    public void OnMessageAdded(string message) 
    { 
     this.stream.OnNext(message); 
    } 

} 

//Calling code  
public IObservable<string> GetMessage() 
{ 
    var listener = new MessageListener(); 
    service.Subscribe(listener); 
    listener.MessageStream.SubscribeOn(Scheduler.NewThread); 
} 

私はこれで十分ですか分かりません。私はSubscribeOnへの呼び出しを信じて、新しいスレッドでサブスクリプションコードだけを実行します。 OnMessageAddedが新しいスレッドによって受信されたことをどうやって確認しますか?

答えて

1

あなた自身が既に発見したように、SubscribeOnはサブスクリプションが起こる場所のみを制御します。しかし、あなたのコードではSubscribeOnはサブスクリプションがないので、何の効果もありません。 SubscribeOnは、サブスクリプションに使用するObservableを返します。 "SubscribeOn"を呼び出してソースの中に何らかのグローバルフラグを設定することはできません。

あなたが実際にやりたいことは、サブスクリプションが行われる前にサービス内の "ObserveOn"に電話することです。 ObserveOnは、メッセージを処理するスレッドを定義します。

public IObservable<string> MessageStream 
{ 
    get 
    { 
     return this.stream.ObserveOn(Scheduler.ThreadPool).AsObservable(); 
    } 
} 

もう一つ

が指摘されるように、あなたのMessageStreamプロパティに、より良い被写体を直接返すのではなく this.stream.AsObservable()を呼び出します。それは次のようになりますように、別のオプションは、MessageListenerのに直接 ObserveOnを書くことであろう。

+0

私はGetMessageメソッドを呼び出すViewModelレベルでsubcribeを呼び出し、ObserveOnDispatcher()も実行しています。 – anivas

+0

おそらく、サービスが実際に何をしているかについてより多くの情報を提供するべきでしょう。私は、サービスがMessageStreamに加入していて、メッセージを別のスレッドで処理したいと思っています。そのため、サービス内でObserveOn(Scheduler.NewThread)を呼び出す必要があります。それとも、私はあなたを完全に間違っていますか? – Christoph

+0

メッセージストリームがリストボックスに表示されるwpfアプリケーションです。 GetMessage()メソッドは、service.Subscribe(listener)を呼び出してデータをストリームする実際のJavaサービスを呼び出すServiceProxyクラスです。このストリームをリッスンするserviceproxyからUIスレッドを切断したいと思います。そうでなければ、UIがストリームが入るたびにフリーズします。 – anivas

関連する問題