委托在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)); 
    }
}

我是根据下面的解释得出这个解决方案的链接

委托在c#中不起作用

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。定时器,它将总是自动触发ui线程上的事件。

我想你把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)

检查你使用的是好的,你的事件是订阅的。

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