ReactiveUI.Validation中ValidationRule的Delay异常及自定义延迟需求
问题分析与解决方案
首先明确你的误区:Rx中的Delay(TimeSpan)操作符是对序列中的每一个元素单独延迟指定时间后推送,而非将整个序列整体偏移。你看到的“每次验证状态变更都延迟5秒”是正常行为——WhenAnyValue会在UserEntry变化时持续推送新的验证状态值,每个值都会被Delay处理。
而你要实现的“首个元素立即推送,首个与第二个元素之间引入5秒延迟”,需要拆分序列分别处理:第一个元素直接输出,后续所有元素延迟5秒后输出。可以用Publish+Take(1)+Concat+Skip(1).Delay()的组合来实现:
this.ValidationRule( vm => vm.UserEntry, this.WhenAnyValue(vm => vm.UserEntry, IsEntryValidOrEmpty) .Publish(seq => // 第一个元素直接发送 seq.Take(1) // 后续元素延迟5秒后发送 .Concat(seq.Skip(1).Delay(TimeSpan.FromSeconds(5))) ), "Invalid entry." );
补充说明
- 使用
Publish是为了避免WhenAnyValue被多次订阅(Take(1)和Skip(1)会触发两次订阅,Publish能让它们共享同一个源序列)。 - 如果你想要的是“仅在首次状态变更后等待5秒,后续变更立即生效”,逻辑需要调整,但根据你的描述,上面的代码应该匹配需求。
内容的提问来源于stack exchange,提问作者Xecrets
相关产品推荐
相关产品推荐

