2011-10-20 69 views
0
private void aMethod() 
    { 
     aTimer = new System.Timers.Timer(3000); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimerEvent); 
     aTimer.Enabled = true; 
     aTimer.Start(); 
    } 

private void button4_Click(object sender, RoutedEventArgs e) 
    { 
     fileEntries = Directory.GetFiles(@"C:\Users\John\Documents\Visual Studio 2010\Projects\ComeOn\ComeOn\bin\Debug\come"); 
     aMethod(); 
     index = 0; 
    } 

private void OnTimerEvent(Object sender, ElapsedEventArgs e) 
    { 
      Bitmap LogoImg = new Bitmap(fileEntries[index]); 
      LogoImg.MakeTransparent(LogoImg.GetPixel(1, 1)); 
      this.Dispatcher.Invoke(
       new Action(() => image1.Source = GetBitmapSource(LogoImg))); 
      index++; 
    } 

fileEntries的長度是3.我創建了一個計時器,它將在3秒開始。首先它會執行image1.Source = GetBitmapSource(LogoImg)//對於fileEntries [0] 3秒鐘,然後對於fileEntries [1] 3秒鐘和結束fileEntries [2] 3秒鐘。c#計時器奇怪的行爲

但是,我的程序做這個:

啓動計時器,運行fileEntries [0],fileEntries [1]和fileEntries [2]0.05秒,然後等待3秒,然後重新開始。爲什麼是這樣?

+0

'index'聲明和初始化在哪裏? – ChrisF

+0

您是否嘗試過設置aTimer.AutoReset = false? –

+0

@Lucasus是的,它沒有幫助。 –

回答

0

你不應該做一次

aTimer = new System.Timers.Timer(3000); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimerEvent); 
aTimer.Enabled = true; 
aTimer.Start(); 

更多。在Form_Load事件中或構造函數中執行。在OnTimerEvent事件,防止在不被初始化文件執行,例如

int index = -1; 
private void OnTimerEvent(Object sender, ElapsedEventArgs e) 

     { 
      if(index != -1) 
      { 
       Bitmap LogoImg = new Bitmap(fileEntries[index]); 
       LogoImg.MakeTransparent(LogoImg.GetPixel(1, 1)); 
       this.Dispatcher.Invoke(
        new Action(() => image1.Source = GetBitmapSource(LogoImg))); 
       index++; 
      } 
      if (index == 3) // when all 3 were loaded, reset index. You can also stop the timer if you won't be loading files the second time 
      { 
       index=-1; 
      } 
     } 

您的代碼或添加新的事件處理程序之前,您應該unsuscribe。但跟蹤事件處理程序添加到事件的難度(或者我應該說我還沒有找到辦法)。

正如@Steven Jeuris所說,當一個事件處理程序被添加到一個事件中時,它被literaly ADDED添加到事件處理程序LIST中。所以每當你的計時器過去時,列表中的每個事件處理程序都會執行,這意味着如果添加了3個事件處理程序(就像你的情況一樣),事件處理程序方法將執行3次。

+0

_「但是要記錄添加到事件中的事件處理程序的數量是棘手的」_小心澄清爲什麼要這麼做? –

+0

我最近遇到事件處理程序在第二次和第三次訂閱對象時出現問題,當我處理該對象並創建另一個具有相同名稱的對象時。奇怪的是,之前訂閱的事件處理程序仍然存在。瞭解當時我有多少事件處理程序對我來說會非常有用,但我沒有找到辦法做到這一點。 – Arie

+0

Tnx,它真的幫助:) –

1

你多久點擊一次該按鈕?

每當你按下按鈕,一個新的事件處理程序將掛鉤到計時器。你永遠不會取消訂閱事件處理程序。

您應該在執行所需工作時防止按鈕被點擊,或者您應該在訂閱之前取消訂閱。


正如漢斯帕桑特在他的評論中指出,你應該也考慮使用BackgroundWorker