我正在使用反应式扩展来使用wpf ui,基本上我有一个文本框,我需要在小时间盘(200-300毫秒)上进行采样和限制(在打字时不断做一些东西,在停止打字时做一些东西)
问题是它有些不可预测,有时会立即触发限制,这可能是因为TextUpdated事件没有使它成为observable或具有observable本身的东西.我也在做一些可能会干扰的锁定,但这通常是通过新的任务而不是在UI线程上完成的.我也有一种潜在的怀疑,即调试可能会影响行为,因为当我设置断点时它似乎会触发更多“错误”
由于observable是在UI线程上创建的,我假设(可能是错误的)它的计时器或其下面使用的任何东西也在该线程上,创建一个新线程来创建可观察对象可能是一个好主意,因此它不会受到UI开销的干扰和潜在的锁定?我如何以最好的方式设置这样一个线程,我想在它结束时空的while循环可能不是一个好主意:)
无论如何,Throttle,Sample工作和与线程关系的被动扩展如何工作?
编辑
似乎问题是我测试它的方式:P如果按住一个键,它似乎在开始重复之前有500毫秒的延迟,如果你只是按键就可以正常工作.叹
解决方法
Sample和Throttle都使用Scheduler.ThreadPool作为他们的时间,所以我很怀疑这是问题所在.
sourceEvents.LogInterval("Source") .Throttle(throttleTimeSpan).LogInterval("Throttled") .Sample(sampleTimeSpan).LogInterval("Sample") .Subscribe();
这是LogInterval的定义:
public static class ObservableEx { public static IObservable<TSource> LogInterval( this IObservable<TSource> source,string message) { return source .TimeInterval() .Do(x => Debug.WriteLine("{0} :: {1} ({2})",message,x.Value,x.Interval.TotalMilliseconds); .RemoveTimeInteval(); } }
如果瓶颈是油门/样品,则可能意味着您在其他地方使ThreadPool饱和.如果是这种情况,并且这些限制器的性能很重要,您可以考虑创建专用线程调度程序并使用自定义distpatcherScheduler作为Throttle / Sample.或者,可能有更好的TPL解决方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。