2010-11-29 3 views
0

Этот вопрос, вероятно, уже был дан где-то, но мне сложно сформулировать его правильно, что затрудняет его поиск.Триггерные события или предупреждения, основанные на редких условиях. (.NET)

Предположим, что у меня есть элементы в приложении WinForms, срок действия которого истекает. У меня есть другие условия, кроме этого, но давайте сделаем это просто. Я хотел бы вызвать событие, когда элемент истекает. Каков идеальный способ сделать это? Проверка каждые X минут? Я смущен, как будто это лучшее решение.

образцы кода как на VB.net, так и на C# приветствуются.

Спасибо

+2

Является ли приложение WinForms, WebForms или Service основано? – 2010-11-29 13:54:58

+0

WinForms. Добавил его к вопросу. – fbernier 2010-11-29 14:25:09

ответ

1

Используйте либо SortedDictionary, как указано в CodeInChaos, либо SortedList. Выберите, какой из них основан на разделе «Примечания» для каждого. Оба имеют выбор O (log n), поскольку они реализованы как двоичное дерево поиска (что, как я полагаю, так или иначе сбалансировано). Оба будут немного быстрее в конкретных обстоятельствах, описанных в их документации.

В принципе идея заключается в том, чтобы поддерживать две структуры данных:

  1. Ваша коллекция предметов

  2. отсортированный коллекция ссылок на пункты, упорядоченные по дате истечения срока действия.

Вам нужно какое-то обновление() цикл, который будет просто смотреть на первый индексе значения свойств вашего SortedList или SortedDictionary (O (1) операции) и посмотреть, если системная дата прошлого деталь срок годности.

Вот простое использование только с строками и Интсом:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace TestDataStructures 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SortedList<int, string> dict = new SortedList<int, string>(); 
      for (int i = 42; i < 100; i++) { 
       dict.Add(i, i.ToString()); 
      } 
      for (int i = 41; i > 0; i--) { 
       dict.Add(i, i.ToString()); 
      } 

      Console.Out.WriteLine("Smallest value is " + dict.Values[0]); 
      Console.ReadKey(); 
     } 
    } 
} 

Всякий раз, когда вы добавляете новый элемент в вашу основную коллекцию, добавьте ссылку на него в этом SortedList/SortedDictionary и обеспечить срок годности как ключ к Сортировать по. Для хранения ссылок требуется немного больше накладных расходов памяти, но, как сказал CodeInChaos, это будет намного быстрее.Я не думаю, что это ужасно сложно закодировать.

1

я думаю, что это тот случай, когда таймер может быть использован

See Here

6

У один таймер, который проверяет наличие просроченных элементов. Использование одного таймера для каждого элемента не масштабируется для большего количества элементов.

Slow купить легко:
При проверке таймера все элементы для истечения срока действия. Вероятно, приемлемо для < 1000 наименований.

Быстрый, но немного сложнее код:
Есть упорядоченный словарь сроков годности. В таймере проверьте, истек ли первый элемент в упорядоченном списке, а затем запускает событие, удаляет элемент и продолжает проверку со следующего элемента.

Поскольку у вас есть только один таймер, и это дешевая операция, если ничего не происходит, вы можете выбрать довольно быстрый интервал (например, второй).

Смежные вопросы