有人知道为什么控制永远不会被委托,尽管它被调用了吗?无论我是否进行步骤调试,它都无法到达那里。
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));
}
}
我根据下面的解释基于此解决方案 link
答案 0 :(得分:1)
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.Timer,它将始终在UI线程上自动触发事件。
答案 1 :(得分:0)
我认为你正在混合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)
检查您是否正在使用好的,并且您的活动已订阅。
- 适用于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) { }
答案 2 :(得分:0)
试试这个,希望它可以帮到你......
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);
}