2012-05-10 58 views
1

在UI線程我有一段代碼是這樣的:C#和WinForms:Form.Show的「完整性」()調用

SomeForm form = new SomeForm(); 
(...) 
form.Show(); 

SomeForm類尤其具有System.Windows.Forms.Timer實例作爲構件正在由InitializeComponent()自動生成的代碼看起來像這樣初始化:

this.UploadStatusTimer.Enabled = true; 
this.UploadStatusTimer.Interval = 1000; 
this.UploadStatusTimer.Tick += new System.EventHandler(this.UploadStatusTimer_Tick); 

form.Show()將在年底提高正在由SomeForm_Load(object sender, EventArgs e)處理Form.Load事件。

我的問題是:有沒有可能在SomeForm_Load之前處理UploadStatusTime_Tick

+0

是的,這是可能的。 – Mr47

回答

0

你在問什麼:「從構建我的表單到Load事件觸發爲止需要多長時間?

除了「是的,這總是可能的」的理論答案之外,它真的取決於您的示例代碼需要多長時間(...)。只要Enabled設置爲true(構建時),計時器就會開始倒計時。

需要注意的是,UI交互是通過消息泵處理的。因此,想到winforms計時器,計時器本身在後臺運行(甚至在.net之外;它使用本地windows計時器),當計時器到期時,它會嚮應用程序發送消息,然後將消息排隊消息泵說:「嘿,計時器滴答發生了。」同樣的事情適用於表單加載事件,它通過消息泵上的消息觸發。因此,如果定時器在表單「加載」之前到期,那麼定時器消息將在隊列上的「表單加載」消息前面並首先被處理。

如果您有興趣瞭解更多信息,那麼winforms消息泵(或某些人可能稱之爲的消息循環)上有許多文章或堆棧溢出問題。

+0

在UI線程中運行的所有東西,我預計在當前執行路徑(即表單創建,'.Show()'和'SomeForm_Load')中的所有語句都將由'external'事件完成,就像計時器滴答,將有權處理。所以這不是那麼簡單? – mczers

+0

@MichałCzerski我已經通過對Winforms消息泵的簡短分析更新了我的答案,這解釋了爲什麼對.Show()的調用不是一直到Load事件的單個不間斷執行。 – roken

4

InitializeComponent()由窗體的構造函數調用,因此在調用form.Show()之前可能已經調用了UloadStatusTimer_Tick

如果您希望定時器開始你打電話form.Show()後,在設計器中設置UploadStatusTimer.Enabled = false,覆蓋OnShow並使用此方法來設置this.UploadStatusTimer.Enabled = true

0

爲確保定時器在之前不會關閉,請在設計器中將其禁用,並在事件中調用timer.Start();

爲確保它在之前確實關閉,請將timer_Tick函數中的代碼移至中心方法,並從構造函數中調用該方法。