2015-02-10 74 views
0

其可能的,我可以创建一个单独的计时器为不同的情况?创建个人计时器激活后几分钟

例如我有3个不同的标签,当我右键单击它显示menustrip与“确认”。首先我要改变活动到没有,并在一定的时间后,我改回到是。

void contexMenuuu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
{ 
    if (item.Text == "Acknowledge") 
     { 
      label.Text = "NO"; 

      System.Timers.Timer aTimer = new System.Timers.Timer(); 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      int _timeinverval = 5; //mins 
      aTimer.Interval = TimeSpan.FromMinutes(_timeinverval).TotalMilliseconds; 
      aTimer.Enabled = true; 

     } 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    label.Text = "YES"// update after 5min 
} 

如果我想在5分钟后将主动回复为'YES',那我该如何处理'OnTimedEvent'?

+0

代码是否工作? – 2015-02-10 04:13:20

+0

@KcDoD嗨,我现在能够做的只是一个标签,如果我使用柜台来做这一切。当我点击第二个标签时,计数器将被重置。而我现在需要的是为每个标签创建个人计时器。它有可能我们可以得到计时器滴答计数? – JefferyLR 2015-02-10 04:17:43

+2

只是代码注释:代替在您的代码中计算5分钟内有多少毫秒的数学,请考虑使用TimeSpan类来代替更具可读性的代码:'aTimer.Interval = TimeSpan.FromMinutes(5).TotalMilliseconds ;' – 2015-02-10 04:19:15

回答

1

我不清楚这个问题到底是什么。您发布的代码实际上不会工作(除非计时器为System.Windows.Forms.Timer,否则不能更新Text属性)。并且您使用代码示例中未声明的变量itemlabel

也就是说,基于对你仿佛更一般的描述要想做的话,如果你使用的是.NET 4.5,你可能应该跳过计时器,只是使用async/await

async void contexMenuuu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
{ 
    var item = ... something here?; 
    var label = ... and something here?; 

    if (item.Text == "Acknowledge") 
    { 
     label.Text = "NO"; 
     await Task.Delay(TimeSpan.FromMinutes(5)); 
     label.Text = "YES"; 
    } 
} 

简单得多。 :)

如果你没有使用.NET 4.5,然后猜测真正的问题在这里,我会假设你遇到的问题是label在某种程度上是唯一的,您希望在计时器过去时能够设置适当的label实例。在这种情况下,你可以使用自己的匿名方法作为定时器的事件处理程序,捕捉label值和分配它还有:

void contexMenuuu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
{ 
    var item = ... something here?; 
    var label = ... and something here?; 

    if (item.Text == "Acknowledge") 
    { 
     label.Text = "NO"; 

     System.Timers.Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed += (sender, e) => Invoke((MethodInvoker)(() => label.Text = "YES")); 
     aTimer.Interval = TimeSpan.FromMinutes(5).TotalMilliseconds; 
     aTimer.Enabled = true; 
    } 
} 

注意的是,上述假设labelcontextMenuuu_ItemClicked()方法的局部变量。在这种情况下,该值被正确捕获(假设它在方法的其他地方没有被修改)用于定时器事件处理程序。如果在其他地方声明了它,那么您将需要声明一个局部变量,将其复制到label的值中,并在事件处理程序匿名方法中使用该局部变量而不是label本身。

相关问题