0

有谁知道为什么控制权永远不会到达委托,尽管它被调用了?无论我是否在逐步调试,它都不会到达那里。

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)); 
    }
}

我根据以下 链接中的说明基于此解决方案

4

3 回答 3

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 线程上的事件。

于 2013-04-23T08:12:09.160 回答
0

我认为您正在混合System.Timers.TimerSystem.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) { }
于 2013-04-23T08:02:51.907 回答
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);
}
于 2013-04-23T08:20:49.723 回答