【发布时间】:2014-02-18 16:47:14
【问题描述】:
假设我有这样的东西:
<TextBox Text="{Binding Text, Mode=TwoWay}" />
还有这样的:
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
// run DoWork() when this.Text changes
Observable.FromEventPattern<PropertyChangedEventArgs>(this, "PropertyChanged")
.Where(x => x.EventArgs.PropertyName.Equals("Text"))
.Subscribe(async x => await DoWork());
}
private async Task DoWork()
{
await Task.Delay(this.Text.Length * 100);
}
public event PropertyChangedEventHandler PropertyChanged;
private string _Text = "Hello World";
public string Text
{
get { return _Text; }
set
{
_Text = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}
在这种情况下,用户可能会非常快速地打字。我需要:
DoWork() 不得在 DoWork() 已运行时运行
用户可以输入sspurs, some changes, pause, some changes
DoWork() 不需要每次更改,只有最后一次更改
DoWork() 的调用频率无需超过 1 秒
DoWork() 不能等到最后一次更改,如果冲刺时间大于 1 秒
DoWork() 不应在系统空闲时调用
DoWork() 的持续时间因 this.Text 的长度而异
问题不在于 Rx 是否可以做到这一点。我知道可以。正确的语法是什么?
【问题讨论】:
-
怪异的,我现在正在做这个确切的事情并且想知道确切的事情
-
这不是纯 RX 解决方案的要求。
-
想出一个更好的标题哈哈
-
@PaulBetts,好点子。
-
所提出的解决方案都不是简单的。我认为,鉴于 SO 上最有经验的 Rx 人员显然必须努力工作才能获得可行的解决方案,这掩盖了这显然不很容易的事实?我认为这里的任何代码都不容易阅读,更不用说编写了。这就是为什么我仍然倾向于在流之外做这件事。根据我的经验,在 monad 之外管理慢速消费者更加容易。
标签: winrt-xaml system.reactive