我的服务方法接受一个监听器并用数据流调用它。我正在尝试将此流转换为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?
答案 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()
而不是直接返回主题。