【问题标题】:Iterate through growing list and remembering position遍历不断增长的列表并记住位置
【发布时间】:2021-02-26 12:40:37
【问题描述】:

我正在尝试将另一个类/线程(不断增长)中的现有列表添加到包含要验证的值的新列表中。但我不确定如何在不一遍又一遍地处理相同值的情况下做到这一点。我只想处理最新的附加值。见下面代码

public static void ParsePhotos()
        {
            int tmprow = 0;
            string checkthis = "";

            List<String> PhotoCheck = new List<String>();

            while (Core.Hashtag.PhotoUrls.Count > Photocheck.Count)
                {

                    foreach (string photourl in Core.Hashtag.PhotoUrls)
                    {
                        PhotoCheck.Add(photourl);
                    }

                    checkthis = PhotoCheck[tmprow];

                    //validate checkthis here
                    
                    //add checkthis to new list if valid here

                    tmprow++;

                    while (Thread.Sleep(10000);

                };
           }

HashSet&lt;String&gt;Core.Hashtag.PhotoUrls 在另一个线程中每隔几秒更新一次。

【问题讨论】:

  • 听起来像是队列处理器的用例。我不会不断地将东西添加到列表中。

标签: c# list hashset


【解决方案1】:

没有实际的方法可以做到这一点,因为HashSet 是一个无序的集合。常规集合也不是线程安全的,在使用多线程时不应该在没有锁定的情况下使用。

执行此操作的典型方法是使用并发队列,其中验证从队列中删除项目,并将它们添加到另一个队列。应该修改产生项目的线程,以将项目添加到并发队列中,而不是添加到 hashSet 中。

    public static Task ValidateOnWorkerThread<T>(
        BlockingCollection<T> queue, 
        Func<T, bool> validateMethod, 
        ConcurrentBag<T> validatedItems,
        CancellationToken cancel)
    {
        return Task.Run(ProcessInternal, cancel);
        void ProcessInternal()
        {
            foreach (var item in queue.GetConsumingEnumerable(cancel))
            {
                if (validateMethod(item))
                {
                    validatedItems.Add(item);
                }
            }
        }
    }

这还有一个好处是可以实时处理物品,而不需要一直休眠。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2019-02-12
    • 2021-06-21
    相关资源
    最近更新 更多