我在这里遇到了一些问题,我想要一些帮助。
我的代码是在网页上无限搜索模式,无论何时找到新内容,它都会将其写入文件。
但是,有时候,我正在清理的信息已经在文件中,但它没有更新,我不想在我的文件上重复输入。
因此,我只是创建了一个字符串列表,在那里添加每个条目,每次代码找到它要查找的内容时,它会在写入文件之前检查字符串是否已经在该列表中。
你可以清楚地看到为什么这是一个坏主意......因为它全天候运行,这个列表将无休止地变得更大。但是有一个问题!我百分百肯定,如果15分钟过去,我正在寻找的信息将永远不会重复。
所以,我真正想要的是消除此列表中的项目15分钟。我无法想到这样做的简单和/或优雅。或者,我不知道是否有一些数据结构或库可以解决这个问题。
这就是我在这里问的原因:什么是创建某种“定时列表”的最佳解决方案,其中有一段时间的项目会在迭代结束时被删除?
提前致谢。
答案 0 :(得分:2)
您是否尝试过.NET的内置MemoryCache?
您可以设置包含绝对超时的缓存策略,我认为这是您想要的。
答案 1 :(得分:0)
答案 2 :(得分:0)
你需要运行一些定期修剪列表的东西。
我过去所做的是:
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver
(qReciever);
}
代替ConcurrentBag<Tuple<DateTime, T>>
List<T>
这是一种更积极的方法,但它非常简单。但是,由于您现在正在使用两个线程,因此必须小心不要死锁。这就是为什么我使用像theBag.Add(Tuple.Create(DateTime.Now, myObject));
这样的东西。您还可以查看其他ConcurrentBag
个集合。您提到了一个队列,因此您可以尝试Concurrent
像其他人建议的那样,仔细查看缓存库并权衡您的选择。完整的缓存库可能过度。
答案 3 :(得分:0)
创建一个具有字符串属性和timestamp属性的类,而不是字符串列表。创建类的实例时,使用DateTime.Now自动填充timestamp属性。
每次迭代列表以查看字符串是否存在时,请检查时间戳属性并丢弃超过15分钟的任何项目。
例如
class TimeStampedSearchResult
{
public string SearchResult { get; set; }
public DateTime TimeStamp { get; private set; }
public TimeStampedSearchResult(string searchResult)
{
SearchResult = searchResult;
TimeStamp = DateTime.Now;
}
public void UpdateTimeStamp()
{
TimeStamp = DateTime.Now;
}
}
然后你就可以使用它:
public SearchForever()
{
//the results list
List<TimeStampedSearchResult> results = new List<TimeStampedSearchResult>();
//a list of expired results to remove from results list
List<TimeStampedSearchResult> expiredResults = new List<TimeStampedSearchResult>();
while (true)
{
//search for a result
var searchResult = new TimeStampedSearchResult(SearchForStuff());
bool found = false;
//iterate our list
foreach (var result in results)
{
if (result.SearchResult == searchResult.SearchResult)
{
result.UpdateTimeStamp();
found = true;
}
else
{
if (result.TimeStamp < DateTime.Now.AddMinutes(-15))
{
expiredResults.Add(result);
}
}
}
if (!found)
{
//add to our results list
results.Add(searchResult);
//write result to file
WriteResult(searchResult.SearchResult, "myfile.txt")
}
//remove expired results
foreach (var oldResult in expiredResults)
results.Remove(oldResult);
//make sure you clear the expired results list too.
expiredResults.Clear();
}
}