这个问题可能已经在某个地方得到了回答,但是我很难正确地制定它,这使得它很难找到任何相关内容。
假设我的WinForms应用程序中的项目有一个到期日期。我有更多不同的条件,但让我们这么简单。我想在项目到期时触发事件。这样做的理想方式是什么?每隔X分钟检查一次?我很困惑,好像这是最好的解决方案。
欢迎使用VB.net或C#中的代码示例。
谢谢
答案 0 :(得分:6)
有一个计时器,用于检查过期的项目。每个项目使用一个计时器不会缩放到更大的项目计数。
慢买易:
在计时器中检查所有项目是否到期。 <1000件可能接受。
快速但有点难以编码:
有一个有序的有效期字典。在计时器中检查有序列表中的第一个元素是否已过期,然后触发该事件,删除该项目,并继续检查下一个项目。
由于你只有一个计时器,如果没有任何反应,它的操作便宜,你可以选择一个相当快的间隔(如一秒钟)。
答案 1 :(得分:1)
我认为这是可以使用Timer的情况
答案 2 :(得分:1)
使用SortedDictionary之类的CodeInChaos或SortedList。根据每个“备注”部分选择哪一个。两者都有O(log n)检索,因为它们被实现为二叉搜索树(我假设它在某种程度上是平衡的)。在他们的文档中描述的特定情况下,两者都会略微加快。
基本上,我们的想法是维护两个数据结构:
您的商品集合
对按到期日期排序的项目的引用的已排序集合。
您需要某种Update()循环,它只会查看SortedList或SortedDictionary(O(1)操作)的Values属性的第一个索引,并查看系统日期是否超过该项目的过期日期。 / p>
这里只是字符串和整数的简单用法:
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所说的那样,它会快得多。我不认为编码非常困难。