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

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 スレッドで自動的にイベントが発生します。

于 2013-04-23T08:12:09.160 に答える
0

System.Timers.Timerと を混ぜていると思いますSystem.Windows.Forms.Timer

  • System.Timers.Timer: イベントが呼び出されElapsedElapsedEventArgs
  • System.Windows.Forms.Timer: イベントが呼び出されTickEventArgs

サインはご覧の通り

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 に答える