为此提供RX简单示例帮助

Rea*_*der 3 c# system.reactive

我搜索了一个样本,但找不到清楚解释如何使用RX设置的东西:我有这个要求......

  1. 在WPF应用程序中,我有一个列表框
  2. 调度程序计时器例程每隔2秒向本地列表添加一些随机数
  3. 现在我想设置一个observable/observer来观察这个List <int>,因为它不断构建,并将最新添加的数字添加到列表框的items集合中.

听起来非常简单,我在后台线程中完成了第三位(没有RX,但在list <int>上有标准查找)并且很容易添加到列表框中.当没有背景工作者等尝试做同样的事情并且只使用RX时,我被卡住了.

为可能的愚蠢问题道歉(对于那里的RX专家),但请帮助我们如何使用RX完成此WPF.

谢谢.

Eni*_*ity 9

使用Rx时,您需要牢记IEnumerable<T>&IObservable<T>(以及IEnumerator<T>&IObserver<T>)之间的二元性.

您应该始终查找实现的对象IEnumerable<T>并考虑如何替换它们IObservable<T>.

在您的问题中,您说您有一个计时器,将一些数字添加到List<int>您要观察的数字并将新数字添加到列表框中.所以我会考虑用一个替换列表IObservable<int>.这里的诀窍不是关于查看列表(或者是ObservableCollection<int>),而是关于使用Rx作为代码的核心部分.

所以,这是一个简单的例子.

从问题中描述的核心元素开始:

var dispatchTimer = new DispatcherTimer();
var random = new Random();
var listBox = new ListBox();
Run Code Online (Sandbox Code Playgroud)

dispatchTimer以下位置创建一个observable :

IObservable<IEvent<EventArgs>> ticks =
    Observable.FromEvent(
        h => dispatchTimer.Tick += h,
        h => dispatchTimer.Tick -= h);
Run Code Online (Sandbox Code Playgroud)

查询observable以创建一个新的随机数可观察量:

IObservable<int> randomNumbers =
    from tick in ticks
    select random.Next(1, 11);
Run Code Online (Sandbox Code Playgroud)

现在,订阅可观察的随机数以更新列表框:

_updateListBoxSubscription =
    randomNumbers.ObserveOnDispatcher().Subscribe(n => listBox.Items.Add(n));
Run Code Online (Sandbox Code Playgroud)

.ObserveOnDispatcher()调用将确保将数字添加到UI线程上的列表框中.

您需要定义一个字段或属性来保存对订阅的引用,以便不会收集垃圾.这正是添加处理程序时事件处理程序字段所执行的操作,但是对于Rx,您必须明确地执行此操作.

private IDisposable _updateListBoxSubscription;
Run Code Online (Sandbox Code Playgroud)

你去了 - 你现在有一个列表框,从按时间指定的时间间隔生成的随机数更新.

就这么简单.我希望这有帮助.