2012-03-20 50 views
0

在我的winform應用程序中,我有一個窗體用於顯示「Please wait ...」消息以及進度條或一些文本。出於性能方面的原因,表單是一個使用BringToFront(),Show()和Refresh()打開的單例,並用Hide()關閉。表單有時不會隱藏,儘管處於終止狀態

我正在使用try ... finally pattern來顯示此表單並隱藏它。

try 
{ 
WaitForm.Display(); 
// Some code 
} 
finally 
{ 
WaitForm.Hide(); 
} 

在一些罕見的情況下,用戶報告表單沒有關閉。你能想到爲什麼表單不能關閉的原因嗎?用戶界面在發生這種情況時會作出響應。

+0

您能重現該錯誤嗎?我不明白爲什麼它沒有被稱爲... – squelos 2012-03-20 09:12:10

+1

這是所有的代碼在finally塊? 'WaitForm.Hide();'之前是否有一些代碼行? – Steve 2012-03-20 09:14:37

+1

@squelos:finally塊中的代碼總是被調用。 'WaitForm.Hide()'不被調用的唯一方法是在語句之​​前有一些代碼退出'finally'塊(可能拋出異常?),或者隱藏表單導致異常本身。 – 2012-03-20 09:20:44

回答

1

通常,在Windows應用程序中,對於任何UI刷新,都需要運行其主消息循環。所以在你的情況下,如果在這個代碼塊之後發生任何緊密的循環/處理,那麼表單可能不會立即隱藏。

也許,您可以在代碼塊之後生成UI線程,以便UI可以刷新。例如,

try 
{ 
    WaitForm.Display(); 
    // Some code 
} 
finally 
{ 
    WaitForm.Hide(); 
    Application.DoEvents(); 
} 
+1

不確定是這種情況。例如,我目睹了表單沒有關閉,用戶可以自由滾動下面的datagridview。等待表單用於填充datagridview控件的SQL查詢。 – Nezreli 2012-03-20 09:24:23

+1

@Nezreli,也許,調用'WaitForm.Hide'它自己拋出一個異常。你可以通過在finally塊中放入try-catch來捕獲並記錄異常來確認它。隱藏拋出異常的原因之一可能是它已經在非UI線程(或不同於創建並顯示錶單的線程)上調用 - 但是在這種情況下,您應該通過隱藏形成。 – VinayC 2012-03-20 09:31:58

+0

Application.DoEvents()方法已解決該問題。謝謝。 – Nezreli 2012-03-27 06:50:49