根据罕见情况触发事件或警报。 (。净)

时间:2010-11-29 13:50:19

标签: c# .net vb.net

这个问题可能已经在某个地方得到了回答,但是我很难正确地制定它,这使得它很难找到任何相关内容。

假设我的WinForms应用程序中的项目有一个到期日期。我有更多不同的条件,但让我们这么简单。我想在项目到期时触发事件。这样做的理想方式是什么?每隔X分钟检查一次?我很困惑,好像这是最好的解决方案。

欢迎使用VB.net或C#中的代码示例。

谢谢

3 个答案:

答案 0 :(得分:6)

一个计时器,用于检查过期的项目。每个项目使用一个计时器不会缩放到更大的项目计数。

慢买易:
在计时器中检查所有项目是否到期。 <1000件可能接受。

快速但有点难以编码:
有一个有序的有效期字典。在计时器中检查有序列表中的第一个元素是否已过期,然后触发该事件,删除该项目,并继续检查下一个项目。

由于你只有一个计时器,如果没有任何反应,它的操作便宜,你可以选择一个相当快的间隔(如一秒钟)。

答案 1 :(得分:1)

我认为这是可以使用Timer的情况

See Here

答案 2 :(得分:1)

使用SortedDictionary之类的CodeInChaos或SortedList。根据每个“备注”部分选择哪一个。两者都有O(log n)检索,因为它们被实现为二叉搜索树(我假设它在某种程度上是平衡的)。在他们的文档中描述的特定情况下,两者都会略微加快。

基本上,我们的想法是维护两个数据结构:

  1. 您的商品集合

  2. 对按到期日期排序的项目的引用的已排序集合。

  3. 您需要某种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所说的那样,它会快得多。我不认为编码非常困难。