委托在c#中不起作用

时间:2013-04-23 07:55:06

标签: c# delegates

有人知道为什么控制永远不会被委托,尽管它被调用了吗?无论我是否进行步骤调试,它都无法到达那里。

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

3 个答案:

答案 0 :(得分:1)

InvokeInvokeRequired通常用于确保在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.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) { }

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