我正在寫一個應用程序,它需要在加載數據庫時進行狀態欄更新。我將標籤設置爲「Database loading ...」,然後使用BackgroundWorker
加載數據庫。當工作人員完成時,我將標籤設置爲「數據庫已加載」。但是,這隻能在啓動時完成,而且我不希望標籤可見很長時間,並且希望在工作人員完成後幾秒鐘後清除標籤。我可以在我的主設備上放置一個專用的計時器對象,但是這個操作只是它唯一的工作,而且似乎應該存在一個更優雅的解決方案。所以,我想lambda表達式:安排單火事件
void dataLoader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataLabel.Text = "Database Loaded";
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 5000;
timer.Tick += new EventHandler((o, a) =>
{
DataLabel.Text = "";
(o as System.Windows.Forms.Timer).Enabled = false;
});
}
當然timer
的範圍函數退出後到期,這是Tick
事件不會被調用。
如何在不使用全局實例定時器的情況下運行簡單的單火事件?
我不能相信我忘了開始計時器......我非常渴望責怪GC!不幸的是,它在GC停止時並沒有得到它,所以我只是將'Stop'切換爲'Dispose'。 (我把一個處理程序掛到了'Disposed'事件上,它從來沒有被調用過。)另外,在'})行中有一個流浪的圓括號:' – dlras2 2010-07-14 13:22:12
@Daniel:我修正了錯字。關於GC ...我說定時器根源本身。我在Reflector中查看它,它在做的方式是在定時器啓動時調用'GCHandle.Alloc',然後在停止時釋放該句柄。調用'Dispose'或'Stop'與我所能說的完全相同。所以停止定時器應該足夠了。我認爲'Disposed'事件只會在調用Dispose時引發,而不會在GC運行終結器時引發。 – 2010-07-14 13:56:08