可能我可以为不同情况创建个人计时器吗?
例如,我有3个不同的标签,当我右键单击它时显示menustrip" Acknowledge"。首先,我想将活动更改为NO,并在某个时间后将其更改回YES。
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
}
我与' OnTimedEvent'有什么关系?如果我想将活动改回“是”的话。 5分钟后?
答案 0 :(得分:1)
我真的不清楚这里究竟是什么问题。您发布的代码实际上不起作用(您无法从计时器回调更新Text
属性,除非计时器是System.Windows.Forms.Timer
,它不在此处。并且您使用未在代码示例中声明的变量item
和label
。
也就是说,基于对您似乎想要做的更一般的描述,如果您使用的是.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;
}
}
请注意,上述假设label
是contextMenuuu_ItemClicked()
方法中的局部变量。在这种情况下,正确捕获该值(假设它未在方法中的其他位置修改)以在timer事件处理程序中使用。如果它在别处声明,那么你需要声明一个局部变量,在其中复制label
的值,并在事件处理程序匿名方法中使用该局部变量而不是label
本身。