微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Reactive Extensions,锁和线程

我正在使用反应式扩展来使用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] 举报,一经查实,本站将立刻删除。

相关推荐