簡體   English   中英

C#定時器奇怪的行為

[英]c# timer strange behavior

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秒。

但是,我的程序這樣做:

啟動計時器,運行fileEntries [0],fileEntries [1]和fileEntries [2] 0.05秒,然后等待3秒,然后再次啟動。 為什么是這樣?

您多久點擊一次該按鈕?

每次您按下按鈕時,都會將新的事件處理程序掛接到計時器上。 您永遠不會取消訂閱事件處理程序。

您應該在執行所需的工作時防止單擊該按鈕,或者應該取消訂閱然后再次訂閱。


正如Hans Passant在評論中指出的那樣,您可能還應該考慮使用BackgroundWorker

你不應該做

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

或者,您應在添加新的事件處理程序之前取消訂閱。 但是,跟蹤添加到事件中的事件處理程序的數量非常棘手(或者我應該說我還沒有找到一種方法來做到這一點)。

正如@Steven Jeuris所說,將事件處理程序添加到事件中時,實際上是將其添加到事件處理程序LIST中。 因此,每當您的計時器經過時,就會執行列表中的每個事件處理程序,這意味着,如果添加了3個事件處理程序(如您的情況),則事件處理程序方法將執行3次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM