Rx.NET 调用函数在所有回调之后再次直接调用

本文关键字:调用 之后 回调 NET 函数 Rx | 更新日期: 2023-09-27 18:35:41

我想与串行端口进行通信 - 获取一些数据。我想尽快让这些数据循环。因此,我有带有回调的函数 GetData(),它在 WPF 表单上绘制数据。如何在回调之后立即循环调用此 GetData 函数?

比如循环 GetData->Draw->

GetData->Draw 等等?

Upd: Mb 像这样的东西?

var ob = Observable.Create<Data>(
  observer => {
    while(true) {
      observer.OnNext(GetDataFromSerialPort());
    }
});

Rx.NET 调用函数在所有回调之后再次直接调用

我将创建一个通过可观察序列公开串行端口数据的服务。然后,我会将其注入到我的 MVVM 堆栈中。

该服务希望与您拥有的类似,但具有处置功能

public class MySerialPortService : IsCancellationRequested
{
    public IObservable<Data> GetData()
    {
        return Observable.Create<Data>(async (o, cts) =>
          observer => {
            while (!cts.IsCancellationRequested) {
              observer.OnNext(GetDataFromSerialPort());
            }
        });
    }
}
public class MyViewModel : IDisposable
{
    private readonly IMySerialPortService _mySerialPortService;
    private readonly ISchedulerProvider _schedulerProvider;
    private readonly SingleAssignmentDisposable _subscription = new SingleAssignmentDisposable();
    public MyViewModel(IMySerialPortService mySerialPortService, ISchedulerProvider schedulerProvider)
    {
        _mySerialPortService = mySerialPortService;
        _schedulerProvider = schedulerProvider;
    }
    public void Start()
    {
        _subscription.Disposable = _mySerialPortService.GetData()
            .SubscribeOn(_schedulerProvider.Background) //or _schedulerProvider.ThreadPool, or CreateEventLoopScheduler or what ever you do internally.
            .ObserveOn(_schedulerProvider.Foreground)   //or _schedulerProvider.Dispatcher etc...
            .Subscribe(
                val=> Update(val),
                ex=> ...
            )
    }
    public void Dispose()
    {
        _subscription.Dispose();
    }
}

以下帖子可能会有所帮助 - https://github.com/LeeCampbell/RxCookbook/tree/master/IO/Disk。它逐步向您展示如何创建和从磁盘读取的可观察序列。您可以将磁盘 IO 换成串行端口 IO。