【问题标题】:C# DynamicData/ReactiveUI - Unexpected clear change when adding items to cacheC# DynamicData/ReactiveUI - 将项目添加到缓存时出现意外的清除更改
【发布时间】:2020-09-30 21:43:44
【问题描述】:

我正在使用 Edit 方法对 SourceCache 进行多次更新。但是当观察结果集合的变化时,一次返回一个更新。此外,当达到 25 的更新阈值限制时,则清除并更新整个列表。虽然集合中的项目是有效的,但基于更改的 UI 动画并不理想。特别是在整个集合被清除和重建的情况下。以下 sn-p 重现了该问题:

示例片段:

    public class DynamicDataTest
    {
        private readonly SourceCache<string, string> _sourceCache = new SourceCache<string, string>(x => x);
        private readonly ReadOnlyObservableCollection<string> _collection;

        public DynamicDataTest()
        {
            _sourceCache.Connect()
                //.Sort(SortExpressionComparer<string>.Ascending(l => l))
                .Bind(out _collection)
                .Subscribe();

            new SourceList<string>(_collection.ToObservableChangeSet())
                .Connect()
                .ForEachChange(change => Console.WriteLine(change.Reason.ToString()))
                .Subscribe();

            _sourceCache.AddOrUpdate("start");
            _sourceCache.Edit(source =>
            {
                for (int i = 0; i < 26; i++)
                {
                    source.AddOrUpdate(i.ToString());
                }
            });
        }
    }

我希望这个输出:

Add or AddRange
AddRange

结果却是:

AddRange
Clear
AddRange

【问题讨论】:

    标签: c# dynamic-data reactiveui


    【解决方案1】:

    这是预期的行为。

    当绑定到一个可观察的集合时,需要做一个平衡。当您要应用大量更改时,发送重置通知通常比同时应用更改更快。重置会暂停通知集合更改事件,然后清除并重新加载列表。之后它会触发重置。这就是为什么您会看到额外的清除/添加范围

    这由绑定运算符中的重置阈值选项控制。例如

    .Bind(out _collection, resetThreshold:100) //default=25
    

    将在有 100 次要应用的更改时触发重置,而

     .Bind(out _collection, resetThreshold:int.MaxValue)
    

    将确保永远不会使用重置。

    【讨论】:

    • 这是有道理的,但为什么 Edit() 中的更改没有批量处理?如果 _souceCache 为空,则使用 E​​dit 将 20 个项目添加到列表中会创建一个更改事件。但如果一项已存在,则会创建 20 个单独的更改。是不是缺少优化?
    • 在编辑中所做的更改被批量处理以生成单个更改集通知。看到多个单独更新的原因是由于从可观察集合创建了一个更改集。可观察集合在处理一次更新一个元素时会产生单独的更改。这是由于某些平台无法处理可观察集合的批量修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多