委托在c#中不起作用
本文关键字:不起作用 | 更新日期: 2023-09-27 18:10:22
有人知道为什么控件永远不会得到委托,虽然它被调用?不管我是否进行了分步调试,它都不会到达那里。
public void UpdateClock()
{
//control never gets here
}
delegate void UpdateClockDelegate();
private void MT_TimerTick(object source, ElapsedEventArgs e)
{
if (InvokeRequired)
{
//control gets here, but does not invoke, apparently
Invoke(new UpdateClockDelegate(UpdateClock));
}
}
我是根据下面的解释得出这个解决方案的链接
Invoke
和InvokeRequired
通常用于确保函数在ui线程上执行。它通常调用自身,而不是其他函数。
你的代码可以变成这样:
public void UpdateClock()
{
...
}
private void MT_TimerTick(object source, ElapsedEventArgs e)
{
if (InvokeRequired)
{
Invoke(new Action<object, ElapsedEventArgs>(TimerTick), source, e);
}
else
{
UpdateClock();
}
}
此外,我同意Scorpi0使用System.Windows.Forms。定时器,它将总是自动触发ui线程上的事件。
我想你把System.Timers.Timer
和System.Windows.Forms.Timer
混在一起了。
-
System.Timers.Timer
:事件被称为Elapsed
,它需要一个ElapsedEventArgs
-
System.Windows.Forms.Timer
:事件被称为Tick
,它占用EventArgs
MT_TimerTick(object source, ElapsedEventArgs e)
响闹钟
应该是
MT_TimerElapsed(object source, ElapsedEventArgs e)
或
MT_TimerTick(object source, EventArgs e)
检查你使用的是好的,你的事件是订阅的。
- For System.Timers.Timer
MT_Timer.Elapsed += new ElapsedEventHandler(MT_Timer_Elapsed);
MT_Timer.Start();
void MT_Timer_Elapsed(object sender, ElapsedEventArgs e) { }
- System.Windows.Forms.Timer
MT_Timer.Tick += new EventHandler(MT_Timer_Tick);
MT_Timer.Start();
void MT_Timer_Tick(object sender, EventArgs e) { }
试试这个,希望能帮到你…
public void UpdateClock()
{
this.MT_TimerTickCompleted += delegate(object sender, ElapsedEventArgs e)
{
//When MT_TimerTick occur, do something
};
}
delegate void UpdateClockDelegate();
private void MT_TimerTick(object source, ElapsedEventArgs e)
{
if (InvokeRequired)
{
MT_TimerTickNotify(object, e);
}
}
public event EventHandler MT_TimerTickCompleted;
private void MT_TimerTickNotify(object sender, ElapsedEventArgs e)
{
if (MT_TimerTickCompleted != null)
MT_TimerTickCompleted(sender, e);
}