2013-04-23 64 views
0

有誰知道爲什麼,雖然它被調用的控制將永遠不會委託工作?無論我是否進行步調試,它都不會到達那裏。委託不使用C#

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

+6

是否已啓用定時器? – 2013-04-23 07:56:39

+0

應該是調試器到達那裏。 (Tick事件被觸發) – jAC 2013-04-23 07:58:27

+0

UI可能被阻止?當你調用'Invoke()'時,它會在後臺嚮應用程序的消息隊列發送消息,消息隊列必須由控制消息泵處理。如果UI當前被阻止,則不會處理該消息並且該方法不會被調用。 – 2013-04-23 07:58:55

回答

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) { } 
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線程自動觸發事件。

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

感謝大家的回答。我目前的理論爲什麼這不起作用如下:我有Parallel.Invoke去。這使線程進入MT_TimerTick,但主要UI線程(UpdateClock()所屬的線程)被暫停,直到parallel.invoke結束。我應該用後臺工作人員替換parallel.invoke。 – 2013-04-24 08:43:16