[英]Create IO bound observable with RX
我有一个工作线程进行阻塞调用( ReadFrame
)来从套接字读取传入的数据(IO绑定)。 该线程运行一个循环,将数据提供给Subject
,消费者可以观察到。
private void ReadLoop()
{
while (!IsDisposed)
{
var frame = _Socket.ReadFrame();
_ReceivedFrames.OnNext(frame);
}
}
我想知道是否有更多的RX方式来做到这一点。
这是我做的一个尝试(玩具示例):
var src = Observable
.Repeat(Unit.Default)
.Select(_ =>
{
Thread.Sleep(1000); // simulated blocking ReadFrame call
return "data read from socket";
})
.SubscribeOn(ThreadPoolScheduler.Instance) // avoid blocking when subscribing
.ObserveOn(NewThreadScheduler.Default) // spin up new thread (?)
.Publish()
.RefCount();
var d = src.Subscribe(s => s.Dump()); // simulated consumer
Console.ReadLine(); // simulated main running code
d.Dispose(); // tear down
我正在努力正确使用ObserveOn
, SubscribeOn
和调度程序。 玩具示例似乎有效,但我不确定线程的生命周期是否正确管理。
读取器线程是否通过d.Dispose()
调用关闭?
我是否需要创建一个新线程?
我应该使用Observable.Create
吗? 怎么样?
以下@Enigmativity请求的其他信息:
ReadLoop()
方法是符合以下接口的类的一部分:
public interface ICanSocket : IDisposable
{
IObservable<CanFrame> ReceivedFrames { get; }
IObserver<CanFrame> FramesToSend { get; }
}
当处理父ICanSocket
时,其成员_Socket
被设置(关闭)。
最“Rxy”的方法是使用Rxx ,它具有可观察的异步I / O方法。
您的主要担忧似乎是:
解决这些问题的一种方法是只使用异步Create方法:
// just use Task.Run to "background" the work
var src = Observable
.Create<CanFrame>((observer, cancellationToken) => Task.Run(() =>
{
while (!cancellationToken.IsCancellationRequested)
{
var frame = _Socket.ReadFrame();
if (frame == null) // end of stream?
{
// will send a Completed event
return;
}
observer.OnNext(frame);
}
}));
var d = src.Subscribe(s => s.Dump());
Console.ReadLine();
d.Dispose();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.