Список с возможностью тайм-аута/истечения срока действия
Мне нужна такая функция:
AddToList(txtName, timeExpire);
Он выглядит как самоописательный, элемент автоматически истекает и удаляется из списка.
Я не мог себе представить, как это сделать. Может ли кто-нибудь дать мне подсказку?
Ответы
Ответ 1
вы также можете попробовать что-то вроде этого.
Создайте собственный класс
public class Custom
{
string item; //will hold the item
Timer timer; //will hanlde the expiry
List<Custom> refofMainList; //will be used to remove the item once it is expired
public Custom(string yourItem, int milisec, List<Custom> refOfList)
{
refofMainList = refOfList;
item = yourItem;
timer = new Timer (milisec);
timer.Elapsed += new ElapsedEventHandler(Elapsed_Event);
timer.Start();
}
private void Elapsed_Event(object sender, ElapsedEventArgs e)
{
timer.Elapsed -= new ElapsedEventHandler(Elapsed_Event);
refofMainList.Remove(this);
}
}
Теперь вы можете создать List<Custom>
и использовать его. Элементы будут удалены после истечения указанного времени.
Ответ 2
Если вы нацеливаете .NET 4 или выше, используйте MemoryCache (или вы получите свою собственную реализацию из ObjectCache).
Назад до 4, если вы хотите использовать кеш в своем приложении, вы можете просто пропустить System.Web.Cache и использовать его в любом .NET приложение. У него не было никаких реальных зависимостей от какого-либо "веб-кода", но для этого требовалась ссылка System.Web.dll. Это показалось странным (например, ссылка на Microsoft.VisualBasic.dll из приложения С#), но на самом деле не повлияла на ваше приложение отрицательно.
С появлением профиля клиента важны разрывы зависимостей между настольным и ориентированным на сервер кодом. Таким образом, ObjectCache был представлен так, чтобы разработчики настольных приложений (не уверенные в том, что у Silverlight, wp7) могли разбить эту зависимость и иметь возможность настраивать только профиль клиента.
Ответ 3
Просто быстрый пример ответа. Дал бы
Добавить ссылку на System.Runtime.Caching
MemoryCache cache = new MemoryCache("CacheName");
cache.Add(key, value, new CacheItemPolicy()
{ AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20) });
Затем вы можете проверить, находится ли что-то в кэше, перейдя
if (cache.Contains(key))
И если вы хотите, чтобы ваш кеш имел низкое временное ограничение, вам нужно будет изменить время обновления кэша с помощью небольшого взлома.
MemoryCache AbsoluteExpiration действует странно
Ответ 4
Вам нужно будет создать объект, который сможет управлять этим.
Подумайте, что нужно хранить для каждого элемента. В основном, данные (например, txtName
) и время истечения. Это означает, что вам, вероятно, понадобится класс или структура, у которых есть только эти 2 элемента.
Ваш класс ExpiringList
будет списком этого типа.
Теперь у вас есть базовая структура данных (коллекция/список ExpiringListItem
), вам нужно подумать о том, какие операции вы хотите поддерживать. В настоящее время вы указали AddToList, другие, вероятно, будут RemoveFromList, Clear и, возможно, итерации по всем элементам.
Единственное, что уникально для вашего ExpyingList по сравнению с обычным List<T>
, это то, что вы хотите автоматически удалить истекшие элементы. Поэтому было бы целесообразно, чтобы ваш ExpiringList реализовал интерфейс IList<T>
и использовал частный список внутри, возможно, вы могли бы создать свой список (и по необходимости ваш класс ExpiredListItem
).
Сложная часть, помимо понимания и реализации наследования (на самом деле отдельный вопрос), разрабатывает, как удалить истекшие элементы.
Это означало бы создание метода внутри вашего класса, который повторялся (в обратном порядке) по вашим элементам, сравнивая их время истечения с текущим временем и удаляя истекшие.
Вы можете реализовать интерфейс просто путем вызова соответствующих методов в своем внутреннем списке.
Вы можете сказать, что на этом этапе вы закончили, так как вы просто вызываете этот метод периодически, чтобы убедиться, что все просроченные элементы исчезли, прежде чем использовать элементы в списке.
Возможно, лучшим вариантом было бы вызвать этот метод перед запуском метода во внутреннем списке. В зависимости от того, как вы будете использовать свой список, это может быть излишним.