将流的侦听器转换为IObservable

时间:2011-11-14 12:15:36

标签: c# system.reactive

我的服务方法接受一个监听器并用数据流调用它。我正在尝试将此流转换为IObservable<T>。到目前为止,这就是我所做的:

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 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,SubscribeOn只会控制订阅的发生地点。但是,在您的代码中,SubscribeOn根本没有任何效果,因为它没有订阅。请记住,SubscribeOn返回一个Observable用于订阅。这不是你可以调用“SubscribeOn”来在源代码中设置一些全局标志或类似的东西。

您真正想要做的是在订阅发生之前立即在您的服务中调用“ObserveOn”。 ObserveOn定义处理incomming消息的线程。另一种选择是将ObserveOn直接写入MessageListener,使其如下所示:

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

另外需要注意的是,在MessageStream属性中更好地调用this.stream.AsObservable()而不是直接返回主题。