2015-02-10 71 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本身。

相關問題