加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Reactive Extensions,锁和线程

发布时间:2020-12-15 21:13:14 所属栏目:百科 来源:网络整理
导读:我正在使用反应式扩展来使用wpf ui,基本上我有一个文本框,我需要在小时间盘(200-300毫秒)上进行采样和限制(在打字时不断做一些东西,在停止打字时做一些东西) 问题是它有些不可预测,有时会立即触发限制,这可能是因为TextUpdated事件没有使它成为observable或
我正在使用反应式扩展来使用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解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读