繁体   English   中英

使用RX创建IO绑定observable

[英]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

我正在努力正确使用ObserveOnSubscribeOn和调度程序。 玩具示例似乎有效,但我不确定线程​​的生命周期是否正确管理。

读取器线程是否通过d.Dispose()调用关闭?
我是否需要创建一个新线程?
我应该使用Observable.Create吗? 怎么样?

以下@Enigmativity请求的其他信息:

ReadLoop()方法是符合以下接口的类的一部分:

public interface ICanSocket : IDisposable
{
    IObservable<CanFrame> ReceivedFrames { get; }
    IObserver<CanFrame>   FramesToSend   { get; }
}

当处理父ICanSocket时,其成员_Socket被设置(关闭)。

最“Rxy”的方法是使用Rxx ,它具有可观察的异步I / O方法。

您的主要担忧似乎是:

  • 订阅时,不要阻止订阅者线程(也就是在后台线程上运行I / O线程)
  • 当调用者取消订阅时,停止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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM