Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法对多个事件使用一个计时器?_C#_Timer_Event Handling_.net 3.5 - Fatal编程技术网

C# 有没有办法对多个事件使用一个计时器?

C# 有没有办法对多个事件使用一个计时器?,c#,timer,event-handling,.net-3.5,C#,Timer,Event Handling,.net 3.5,我在C#NET 3.5中 当计时器过期并执行事件处理程序时会发生什么? 计时器停止存在了吗? 我是否可以在一个计时器上注册不同时间的多个事件,以期望它们都一个接一个地触发?您可以将计时器设置为仅触发事件一次或继续触发事件(timer.AutoReset属性)。是的,您可以在一个计时器上注册几个不同的事件处理程序,但我不知道有任何方法可以知道它们将触发什么顺序。如果这对您很重要,请设置一个处理程序,并让该处理程序调用其他处理程序。如果您试图调用不同的处理程序,每次计时器关闭时,我建议设置一个处理程

我在C#NET 3.5中 当计时器过期并执行事件处理程序时会发生什么? 计时器停止存在了吗?
我是否可以在一个计时器上注册不同时间的多个事件,以期望它们都一个接一个地触发?

您可以将计时器设置为仅触发事件一次或继续触发事件(timer.AutoReset属性)。是的,您可以在一个计时器上注册几个不同的事件处理程序,但我不知道有任何方法可以知道它们将触发什么顺序。如果这对您很重要,请设置一个处理程序,并让该处理程序调用其他处理程序。如果您试图调用不同的处理程序,每次计时器关闭时,我建议设置一个处理程序,该处理程序保留一个枚举,指示要调用哪个函数,并在计时器每次调用时递增该函数。 要调用同一个处理程序来“迭代”参数列表,在每个间隔结束后,我会有一个数组或参数列表,处理程序只会增加一个计数器或使用该列表

using System.Timers;

public class MyTimedDelete {

  private static List<int> ListOfIds=null;
  private static System.Timers.Timer myTimer=null;

  public static void AddIdToQueue(int id)
  {
      if (ListOfIds == null)
      {
         ListOfIds = new List<int>();
         myTimer = new System.Timers.Timer(2000);
         myTimer.Elapsed += OnTimedEvent;
      }

      ListOfIds.Add(id);
      if (ListOfIds.Count==1)
      {
          myTimer.Start();
      }    
  }

  private static void OnTimedEvent(Object source, ElapsedEventArgs e)
  {
      deleteItem(ListOfIds[0]);
      ListOfIds.RemoveAt(0);
      if (ListOfIds.Count == 0) {
          myTimer.Stop();
      }
  }
}
使用系统定时器;
公共类MyTimedDelete{
私有静态列表ListOfIds=null;
私有静态System.Timers.Timer myTimer=null;
公共静态void addedtoqueue(int-id)
{
if(ListOfIds==null)
{
ListOfIds=新列表();
myTimer=新系统计时器计时器计时器(2000);
myTimer.appeased+=OnTimedEvent;
}
添加(id);
if(ListOfIds.Count==1)
{
myTimer.Start();
}    
}
私有静态void OnTimedEvent(对象源,ElapsedEventArgs e)
{
deleteItem(ListOfIds[0]);
ListOfIds.RemoveAt(0);
if(ListOfIds.Count==0){
myTimer.Stop();
}
}
}

计时器只能计时一个时间间隔。这足以对任意数量的事件计时,您只需将间隔设置为到期的最早时间。@Grant我同意,如果不处理/删除它,它不应停止存在。我还假设,它(记录几个滴答声)应该是可能的。但这种行为可能取决于计时器的类型。我知道在.NET中有3个(+1个asp)。所以我想知道,他们中的哪一个能在预期的时间距离内为我提供所需的独立活动。@Hans你能不能重新表述一下“你只需将间隔设置为到期的最早间隔”。我不确定我是否正确理解你的意思。假设你今天有4个约会,而你只有一个手表。你能准时参加所有的4场比赛吗?只需在代码中执行相同的操作。我需要使用不同的参数(要删除的消息的id)启动相同的处理程序。在不同的时间?相同的时间间隔还是不同的时间间隔?那么像我在上面的答案中添加的代码应该可以工作。对吗?这个解决方案是已知的。您建议在SomeFunction中创建新的计时器,但我需要一个通用计时器,以便在消息到达时启动额外的倒计时(相同周期)。当周期结束时,计时器将启动以msgId为参数的已结束事件处理程序。该消息将从队列中删除。然后,这只是我所拥有的消息的扩展。我已经在上面的代码中详细展开了。如果您有这样一个类,那么可以从代码中的任何地方调用MyTimedDelete.AdddToQueue(x);要向队列添加id并使定时事件在经过一段时间后使用该id调用deleteItem函数。我还没有建立这个类,所以我可能有打字错误。由您来构建和测试。