遍历不断增长的列表并记住位置
Iterate through growing list and remembering position
我正在尝试将另一个 class/thread(不断增长)的现有列表添加到包含要验证的值的新列表。但是我不确定如何在不一遍又一遍地处理相同值的情况下做到这一点。我只想处理最新的附加值。见下面代码
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<String>Core.Hashtag.PhotoUrls
在另一个线程中每隔几秒更新一次。
没有实际的方法可以做到这一点,因为 HashSet
是无序集合。常规集合也不是线程安全的,在使用多线程时不应该在没有锁定的情况下使用。
一种典型的方法是使用并发队列,其中验证从队列中删除项目,并将它们添加到另一个队列。应修改生成项目的线程以将项目添加到并发队列中,而不是 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);
}
}
}
}
这也有实时处理项目的优势,而不是需要一直睡觉。
我正在尝试将另一个 class/thread(不断增长)的现有列表添加到包含要验证的值的新列表。但是我不确定如何在不一遍又一遍地处理相同值的情况下做到这一点。我只想处理最新的附加值。见下面代码
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<String>Core.Hashtag.PhotoUrls
在另一个线程中每隔几秒更新一次。
没有实际的方法可以做到这一点,因为 HashSet
是无序集合。常规集合也不是线程安全的,在使用多线程时不应该在没有锁定的情况下使用。
一种典型的方法是使用并发队列,其中验证从队列中删除项目,并将它们添加到另一个队列。应修改生成项目的线程以将项目添加到并发队列中,而不是 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);
}
}
}
}
这也有实时处理项目的优势,而不是需要一直睡觉。