Rea*_*der 3 c# system.reactive
我搜索了一个样本,但找不到清楚解释如何使用RX设置的东西:我有这个要求......
听起来非常简单,我在后台线程中完成了第三位(没有RX,但在list <int>上有标准查找)并且很容易添加到列表框中.当没有背景工作者等尝试做同样的事情并且只使用RX时,我被卡住了.
为可能的愚蠢问题道歉(对于那里的RX专家),但请帮助我们如何使用RX完成此WPF.
谢谢.
使用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)
你去了 - 你现在有一个列表框,从按时间指定的时间间隔生成的随机数更新.
就这么简单.我希望这有帮助.
| 归档时间: |
|
| 查看次数: |
1598 次 |
| 最近记录: |