[英]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.